以下代码迫切需要: values()
来编译,至少在ideone :: C ++ 14中编译:
#include <iostream>
template<int N>
struct Table
{
constexpr Table() : values()
{
for (auto i = 0; i < N; ++i)
{
values[i] = i * i * i;
}
}
int values[N];
};
int main() {
constexpr auto a = Table<1000>();
for (auto x : a.values)
std::cout << x << '\n';
}
但为什么呢?我有想法和#34;值也可以以非constexpr方式初始化,而values()明确表示我们以符合constexpr的方式初始化它&#34;。但是,并没有明确省略: values()
吗?
答案 0 :(得分:5)
考虑语义。
从初始化列表中省略成员将执行默认初始化,在这种情况下,数组将保留未指定的值。这否定了constexpr
的目的。
初始化数组的值对每个数组元素执行零初始化(因为这是一个内置类型的数组)。
答案 1 :(得分:2)
仅仅因为标准要求它。当前C ++标准的草案n4296在:
7.1.5 constexpr说明符[dcl.constexpr]§4(强调我的):
4 constexpr构造函数的定义应满足以下约束条件:
...此外,它的函数体应为= delete,或者它应满足以下约束条件:
(4.4) - 其函数体应为= default,或其函数体的复合语句应满足 constexpr函数的函数体的约束;
(4.5) - 每个非变量非静态数据成员和基类子对象都应初始化(12.6.2);
...