【发布时间】:2014-02-01 08:08:40
【问题描述】:
§12.1/4:及其第一个要点
类 X 的默认构造函数是类 X 的构造函数 可以不带参数调用。如果 类 X 没有用户声明的构造函数,没有参数的构造函数被隐式声明为默认 (8.4)。一个 隐式声明的默认构造函数是 它的类。类 X 的默认默认构造函数定义为 在以下情况下删除:
- X 是一个类似联合的类,它有一个变体成员和一个重要的默认构造函数,
根据这个要点,这个 sn-p 不应该编译,因为 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;
}
【问题讨论】:
-
您确定
b是variant 成员吗?我现在无法检查,但这听起来很可疑,好像只有y和x是变体成员。 -
该标准从不要求代码不编译 - 但有时确实需要诊断(错误/警告)。
标签: c++ c++11 constructor language-lawyer