在回答a question时,我遇到了一个我无法解释的问题。
似乎
之间存在足够大的差异constexpr size_t IntArray[2] = {1, 2};
和
const size_t IntArray[2] = {1, 2};
第一个元素可用于实例化模板,但不能用于第二个元素。
演示差异的示例程序。
#include <cstddef>
template <size_t N> struct Foo {};
// Works fine
void test1()
{
constexpr size_t IntArray[2] = {1, 2};
const size_t i = IntArray[0];
Foo<i> f;
(void)f; // Remove unused f warning.
}
// Does not work
void test2()
{
const size_t IntArray[2] = {1, 2};
const size_t i = IntArray[0];
Foo<i> f;
(void)f; // Remove unused f warning.
}
int main()
{
return 0;
}
使用g ++ 4.9.2我得到以下编译器错误。
g++ -std=c++11 -Wall socc.cc -o socc
socc.cc: In function ‘void test2()’:
socc.cc:17:8: error: the value of ‘i’ is not usable in a constant expression
Foo<i> f;
^
socc.cc:16:17: note: ‘i’ was not initialized with a constant expression
const size_t i = IntArray[0];
^
socc.cc:17:9: error: the value of ‘i’ is not usable in a constant expression
Foo<i> f;
^
socc.cc:16:17: note: ‘i’ was not initialized with a constant expression
const size_t i = IntArray[0];
^
socc.cc:17:9: note: in template argument for type ‘long unsigned int’
Foo<i> f;
^
socc.cc:17:12: error: invalid type in declaration before ‘;’ token
Foo<i> f;
我的问题是为什么constexpr
数组有效而不是const
数组?
答案 0 :(得分:2)
constexpr
确保该值为编译时值,而const
仅禁止修改该值。
如果它是一个编译时间值,很容易标记单个const变量, 对于C-array,需要记住每个索引的信息。
即使我们可以做到
const int two = 2;
constexpr int two_bis = two;
以下是不允许的
const size_t IntArray[2] = {1, bar()}; // with non constexpr bar()
constexpr size_t a = intArray[0]; // we might know that is compile time value
constexpr size_t b = intArray[1]; // but this one is clearly not