考虑结构:
struct mystruct { };
这是否真的有效:
constexpr mystruct mystructInstance = mystruct();
即。 POD的值初始化是constexpr
?类似地,如果结构被定义为:
struct mystruct { ~mystruct(); };
最后,那是怎么回事:
struct mystruct { mystruct(); ~mystruct(); };
我没有将ctr声明为constexpr,但有没有任何隐含的扣除规则可以保护它?
答案 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_1
是LiteralType
。所以以下是有效的并且编译:
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中的描述性错误消息。