我在想象下面的情景: 从一个空向量开始,向它推送一些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。
答案 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 变量必须满足的条件如下(强调我的):
与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;