C++ POD结构的值初始化是constexpr?

C++ POD结构的值初始化是constexpr?,c++,c++11,constexpr,default-constructor,value-initialization,C++,C++11,Constexpr,Default Constructor,Value Initialization,考虑结构: struct mystruct { }; 这是否始终有效: constexpr mystruct mystructInstance = mystruct(); i、 e.POD的值初始化是一个constexpr?类似地,如果结构定义为: struct mystruct { ~mystruct(); }; 最后,关于这个: struct mystruct { mystruct(); ~mystruct(); }; 我没有将ctr声明为constexpr,但是是否有任何隐式演绎规

考虑结构:

struct mystruct { };
这是否始终有效:

constexpr mystruct mystructInstance = mystruct();
i、 e.POD的值初始化是一个
constexpr
?类似地,如果结构定义为:

struct mystruct { ~mystruct(); };
最后,关于这个:

struct mystruct { mystruct(); ~mystruct(); };
我没有将ctr声明为constexpr,但是是否有任何隐式演绎规则可以保证这一点?

如下:

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

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

考虑到您的3个结构:

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

mystruct_1
。因此,以下内容是有效的:

constexpr mystruct_1 mystructInstance_1 = mystruct_1();

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

constexpr mystruct_2 mystructInstance_2 = mystruct_2();
constexpr mystruct_3 mystructInstance_3 = mystruct_3();

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

constexpr mystruct_2 mystructInstance_2 = mystruct_2();
constexpr mystruct_3 mystructInstance_3 = mystruct_3();


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

太好了,谢谢。在我提交bug之前,我基本上是想确保MSVC的行为是不正确的。我很高兴看到constexpr最终在VS 2015中实现,但它仍然不能正常工作。上述案例1在VS中失败,即使在2015年[叹气]+1的链接以及。这是一个很棒的工具。与一起使用非常有用。LiteralType的页面已移至