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

时间:2015-08-11 09:11:08

标签: c++11 constexpr default-constructor value-initialization

考虑结构:

struct mystruct { };

这是否真的有效:

constexpr mystruct mystructInstance = mystruct();

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

struct mystruct { ~mystruct(); };

最后,那是怎么回事:

struct mystruct { mystruct(); ~mystruct(); };

我没有将ctr声明为constexpr,但有没有任何隐含的扣除规则可以保护它?

1 个答案:

答案 0 :(得分:5)

requirements for constexpr variables是:

  

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

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

鉴于你的3个结构:

struct mystruct_1 { };
struct mystruct_2 { ~mystruct_2(); };
struct mystruct_3 { mystruct_3(); ~mystruct_3(); };

mystruct_1LiteralType。所以以下是有效的并且编译:

constexpr mystruct_1 mystructInstance_1 = mystruct_1();

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

constexpr mystruct_2 mystructInstance_2 = mystruct_2();

同样适用于mystruct_3,此外它不是aggregate,也不提供constexpr构造函数。 所以以下内容也无效,无法编译:

constexpr mystruct_3 mystructInstance_3 = mystruct_3();

您还可以查看此online demo中的描述性错误消息。