[class.union]/3 注释中"Absent default member initializers, ..."的句子的目的是什么?



[class.union]/3

联合可以具有成员函数(包括构造函数和 析构函数),但它不应具有虚拟([class.virtual]) 功能。工会不得有基类。工会不得 用作基类。如果联合包含 引用类型 程序格式不正确。[ 注意:默认缺失 成员初始值设定项([class.mem]),如果有任何非静态数据成员 联合有一个非平凡的默认构造函数([class.default.ctor]), 复制构造函数,移动构造函数([class.copy.ctor]),复制 赋值运算符,移动赋值运算符([class.copy.assign]), 或析构函数 ([class.dtor]),对应的成员函数 联合必须由用户提供,否则将被隐式删除 ([dcl.fct.def.delete])为工会。— 尾注 ]

在下面的代码中,clang 会发出相同的错误消息,而不管数据成员U::i是否具有默认成员初始值设定项。 请参阅演示。

#include <iostream>
struct S{
int j = 1;
S(const S&) {};
};
union U
{
int i = 1;
S s;
};
int main()
{
U u;
}

编译器发出的错误消息和注释:

error: call to implicitly-deleted default constructor of 'U'  
U u;
note: default constructor of 'U' is implicitly deleted because field 's' has no default constructor
S s;

您解析句子不正确。Absent 默认成员初始值设定项子句指出,具有非平凡默认构造函数的联合成员可以通过默认成员初始值设定项进行初始化,而不必为联合提供默认构造函数。

这并不是说为不同的成员提供默认成员初始值设定项就足以避免构造函数要求,这似乎是您阅读它的方式。

以下示例有效,因为您突出显示的子句

struct S{
int j = 1;
S(int) {};
};
union U
{
int i;
S s = 1;
};
int main()
{
U u;
}

相关内容

最新更新