繁体   English   中英

从非 constexpr 参数创建 constexpr 数组

[英]Creating a constexpr array from non-constexpr argument

我从这里了解到args不是一个常量表达式 现在我的问题是:我应该在给定的程序中修改什么,以便我能够在第一个变体中拥有一个 static_assert 而不会出现编译时错误。

在以下代码中:

#include <array>

template<typename... Args>
auto constexpr CreateArrConst(Args&&... args)
{
  std::array arr
  {
      args...
  };
  //i want to have an static_assert here without error
  return arr;
}

template<typename... Args>
auto constexpr CreateArrConst_NotWorking(Args&&... args)
{
  constexpr std::array arr
  {
      args...
  };
  static_assert(arr.back() == 4);
  return arr;
}

int main() 
{
  static_assert(CreateArrConst(4).back() == 4);
  // uncomment this to reproduce compile error
  // static_assert(CreateArrConst_NotWorking(4).back() == 4);

  return 0;
}

这是一个复制链接: https ://godbolt.org/z/zjrP1Kvn7

您必须将参数放入模板参数中。 不幸的是,它不能再推断出参数的类型:

#include <array>

template<typename T, T... args>
auto constexpr CreateArrConst()
{
  constexpr std::array arr
  {
      args...
  };
  static_assert(arr.back() == 4);
  return arr;
}

// cleaner solution requiring C++17
template<auto... args>
auto constexpr CreateArrConstCpp17()
{
  constexpr std::array arr
  {
      args...
  };
  static_assert(arr.back() == 4);
  return arr;
}

int main() 
{
  static_assert(CreateArrConst<int, 4>().back() == 4);            // <-- Works!

  static_assert(CreateArrConstCpp17<1, 2, 3, 4>().back() == 4);
  return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM