Bel*_*loc 7 c++ constructor language-lawyer c++11
§12.1/ 4:及其第一个要点
类X的默认构造函数是类X的构造函数,可以在没有参数的情况下调用.如果类X没有用户声明的构造函数,则没有参数的构造函数被隐式声明为默认值(8.4).隐式声明的默认构造函数是其类的内联公共成员.如果出现以下情况,则将类X的默认默认构造函数定义为已删除:
- X是一个类似联合的类,它有一个带有非平凡构造函数的变量成员,
根据这个要点,这个片段不应该编译,就像struct A一个类似联合的类(它包含一个匿名联合),它有一个变量成员,B b;带有一个非平凡的默认构造函数.但是代码在vc ++,clang ++和g ++中编译没有问题.
#include <iostream>
struct B { B(): i(10) {} int i; };
struct A
{
union{ int y = 1; double x; };
int i;
A(int j) : i{j} {};
B b;
A() = default;
};
int main() {
A a;
}
Run Code Online (Sandbox Code Playgroud)
Dan*_*rey 13
该变种成员
union{ int y = 1; double x; };
Run Code Online (Sandbox Code Playgroud)
并且他们都没有一个非平凡的构造函数.
这在§9.5/ 8中定义:
9.5工会[class.union]
8甲工会状类是联合或具有匿名联合作为直接成员的类.类似联合的类X具有一组变体成员.如果
X是联合,其变体成员是非静态数据成员; 否则,其变体成员是作为其成员的所有匿名联合的非静态数据成员X.