繁体   English   中英

为什么我需要在constexpr类中成员初始化非静态数组成员?

[英]Why do I need to member-initialize a non-static array member in a constexpr class?

下面的代码迫切需要: 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';
}

但为什么? 我有想法“值也可以非constexpr方式初始化,而值()明确表示我们以符合constexpr的方式初始化它”。 但是不是省略: values()一样清楚吗?

考虑语义。

从初始化列表中省略成员将执行默认初始化,在这种情况下,数组将保留未指定的值。 这否定了constexpr的目的。

初始化数组的值对每个数组元素执行零初始化(因为这是内置类型的数组)。

仅仅因为标准要求它。 针对当前C ++标准的n4296草案规定:

7.1.5 constexpr说明符[dcl.constexpr]§4(强调我的):

4 constexpr构造函数的定义应满足以下约束:
...

另外,它的函数体应该是= delete,或者它应该满足以下约束条件:

(4.4) - 其函数体应为= default,或其函数体的复合语句应满足constexpr函数的函数体的约束;
(4.5) - 应初始化每个非变量非静态数据成员和基类子对象 (12.6.2);
...

暂无
暂无

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

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