POD结构体的值初始化是一个constexpr
Value initialization of POD struct is a constexpr?
考虑结构体:
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_1
为LiteralType
。所以下面的代码是有效的,并且可以编译:
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();
您还可以在这个在线演示中查看描述性错误消息
相关文章:
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 有没有可能制作一个 constexpr 树?
- 为什么 std::launder 是一个 constexpr 函数?
- 我可以定义一个 constexpr 匿名/未命名变量吗?
- 是否已经有一个 constexpr std::bit_cast 与 g++ 一起使用
- 为什么我不能声明一个 constexpr 本地,而一个 const 一个工作?
- 我可以使用 constexpr 函数声明一个静态数组吗?
- 我可以在模板参数中声明一个 constexpr lambda 吗?
- 用另一个 constexpr 数组对成员数组进行大括号初始化
- 有没有办法构造一个 constexpr 函数来获取双精度的位表示
- 是否可以为 AVR 编写一个 constexpr 舍入函数?
- 如何以静态方式使用另一个 constexpr 数组初始化一个数组
- 为什么在这种情况下它不是一个 constexpr?
- 将对静态存储 cstyle 数组的引用从 constexpr 函数传递到另一个 constexpr 函数
- 如何使用 std::copy 将一个 constexpr 数组复制到另一个 constexpr 数组
- 初始化一个constexpr std ::数组,其大小的n维std ::数组
- 我什么时候可以确定一个 constexpr 全局变量会像 C 宏一样被"forgotten"?
- 将一个 constexpr 数组初始化为其他两个 constexpr 数组的总和
- 一个 constexpr 比 const 更"constant"吗?
- POD结构体的值初始化是一个constexpr