POD结构的值初始化是一个constexpr?

And*_*ker 6 default-constructor value-initialization constexpr c++11

考虑结构:

struct mystruct { };
Run Code Online (Sandbox Code Playgroud)

这总是有效的:

constexpr mystruct mystructInstance = mystruct();
Run Code Online (Sandbox Code Playgroud)

即POD的值初始化是constexpr?类似地,如果结构被定义为:

struct mystruct { ~mystruct(); };
Run Code Online (Sandbox Code Playgroud)

最后,这个怎么样:

struct mystruct { mystruct(); ~mystruct(); };
Run Code Online (Sandbox Code Playgroud)

我没有宣布ctr为constexpr,但有没有任何隐含的扣除规则可以保证这一点吗?

m.s*_*.s. 5

变量要求constexpr是:

constexpr变量必须满足以下要求:

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

鉴于你的3个结构:

struct mystruct_1 { };
struct mystruct_2 { ~mystruct_2(); };
struct mystruct_3 { mystruct_3(); ~mystruct_3(); };
Run Code Online (Sandbox Code Playgroud)

mystruct_1是一个LiteralType.所以以下是有效的并编译:

constexpr mystruct_1 mystructInstance_1 = mystruct_1();
Run Code Online (Sandbox Code Playgroud)

mystruct_2不是一个LiteralType,因为它有一个不平凡的析构函数.因此以下内容无效且无法编译:

constexpr mystruct_2 mystructInstance_2 = mystruct_2();
Run Code Online (Sandbox Code Playgroud)

这同样适用mystruct_3,另外它不是聚合,也不提供constexpr构造函数.所以以下也是无效的,无法编译:

constexpr mystruct_3 mystructInstance_3 = mystruct_3();
Run Code Online (Sandbox Code Playgroud)

您还可以查看此在线演示中的描述性错误消息.

  • 太好了,谢谢你.在提交bug之前,我基本上都试图确保MSVC的行为不正确.我很高兴看到constexpr最终在VS 2015中实现,但它仍然无法正常工作.即使2015年[叹气],VS上面的案例1也失败了.此链接也是+1.这是一个很棒的工具.与http://webcompiler.cloudapp.net/结合使用. (2认同)