如何将constexpr变量作为声明来声明(内置)数组?

时间:2014-07-03 20:58:46

标签: c++ arrays vector initialization constexpr

我在想象下面的情景: 从一个空向量开始,向它推送一些int,然后使用它的大小来声明一个内置数组。

  vector<int> vec;      /* default init'ed */

  for(decltype(vec.size()) i = 0; i != 10; ++i){
    vec.push_back(i);
  }


  constexpr size_t sz = vec.size();
  int arr[sz] = {};     /* list init, left out elem's are 0 */

这个程序对我来说很直观(作为初学者)。但它失败了以下消息:

testconstexpr2.cpp:22:34: error: call to non-constexpr function ‘std::vector<_Tp, _Alloc>::size_type std::vector<_Tp, _Alloc>::size() const [with _Tp = int; _Alloc = std::allocator<int>; std::vector<_Tp, _Alloc>::size_type = long unsigned int]’
testconstexpr2.cpp:23:13: error: size of array ‘arr’ is not an integral constant-expression

我希望在去处理之前坚持使用内置数组,比如std :: array或dynamic array alloc。

2 个答案:

答案 0 :(得分:5)

这不会起作用,因为vec.size()不是constexpr函数,并且数组维度必须是编译时常量表达式。

在C ++ 1y / C ++ 14开发期间(还没有完成),有一个名为std::dynarray的提议允许你这样做,但是这个被删除了,可能会在下一个时候重新启动C ++ 1z / C ++ 17开发。

你能做的是

constexpr size_t sz = 10; /* or any other integral constant expression */
int arr[sz] = {};

答案 1 :(得分:2)

变量的

constexpr表示可以在编译时对其进行求值。可以在运行时或编译时评估constexpr函数。 constexpr 变量必须满足的条件如下(强调我的):

  • 其类型必须是LiteralType。
  • 必须立即构建或分配值。
  • 构造函数参数或要分配的值必须仅包含文字值,constexpr变量和函数
  • 用于构造对象的构造函数(隐式或显式)必须满足constexpr构造函数的要求。在显式构造函数的情况下,它必须指定constexpr。

draft C++ standard部分7.1.5 constexpr说明符 9 一致。

std::vector::size不是constexpr方法,所以这不会起作用。如果您事先知道大小,那么您可以使用文字10声明变量:

constexpr size_t sz = 10 ;

请注意,您可以使用 const 以及since it is being initialized with a literal

const size_t sz = 10;