根据C++ 11标准中的§12.1/ 4,代码不应该编译

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.