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

Value initialization of POD struct is a constexpr?

本文关键字:一个 constexpr 结构体 初始化 POD      更新时间:2023-10-16

考虑结构体:

struct mystruct { };

这总是有效的吗?

constexpr mystruct mystructInstance = mystruct();

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

struct mystruct { ~mystruct(); };

最后,这个呢:

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

我没有将ctr声明为constexpr,但是是否有任何隐含的演绎规则来保证这一点?

constexpr变量的要求如下:

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

  • 它的类型必须是LiteralType
  • 必须立即构造或赋值。
  • 构造函数参数或要分配的值必须只包含文字值、constexpr变量和函数。
  • 用于构造对象(隐式或显式)的构造函数必须满足constexpr constructor的要求。如果是显式构造函数,则必须指定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,另外它不是聚合,也不提供constexpr构造函数。所以下面的代码也是无效的,编译失败:

constexpr mystruct_3 mystructInstance_3 = mystruct_3();

您还可以在这个在线演示中查看描述性错误消息