§12.1/4: and its first bullet point
类X的默认构造函数是类X的构造函数,可以在没有参数的情况下调用 . 如果类X没有用户声明的构造函数,则没有参数的构造函数被隐式声明为默认值(8.4) . 隐式声明的默认构造函数是其类的内联公共成员 . 如果出现以下情况,则类X的默认默认构造函数被定义为已删除:X是一个类似于联合的类,其变体成员具有非平凡的默认构造函数,
根据这个要点,这个片段不应该编译,因为 struct A
是一个类似联合的类(它包含一个匿名联合),它有一个变体成员, B b;
带有一个非平凡的默认构造函数 . 但code compiles without a problem in vc++, clang++ and 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;
}
1 回答
变体成员是
并且他们都没有一个非平凡的构造函数 .
这在§9.5/ 8中定义: