struct X {};
struct Y {
Y() = default;
X& x;
};
在 C++11 中运行良好。我想知道 Y::x 是如何在幕后实际初始化的?
即使您明确指出Y()
应该默认,编译器也有义务在某些条件下删除默认构造函数(强调添加):
8.4.2/4 显式默认函数
显式默认函数和隐式声明函数统称为默认函数,实现应为它们提供隐式定义(12.1 12.4、12.8),这可能意味着将它们定义为已删除
和
12.1/5 构造函数:
...
...类 X 的默认默认构造函数在以下情况下定义为已删除:
- 任何没有大括号或等号初始化器的非静态数据成员都是引用类型
但定义一个已删除的函数或构造函数并不是错误,除非您实际尝试使用它:
8.4.3/2 删除的定义
隐式或显式引用已删除函数(而不是声明它)的程序是格式错误的。
它不能在任何主要编译器中编译。它将编译,直到创建类型的对象Y
。
如果您创建类型的对象Y
,则 clang 的输出将是
error: call to implicitly-deleted default constructor of 'Y'
note: explicitly defaulted function was implicitly deleted here
Y() = default;
note: default constructor of 'Y' is implicitly deleted because field
'x' of reference type 'X &' would not be initialized
X& x;
当您声明user-defined
构造函数时,它只是一个空函数,会出现错误,而不会创建对象。
迈克尔·伯尔是对的。隐式默认的构造函数工作得很好。正如我所见,这里的诊断没有问题。
如果您不制作 Y 对象,它会“工作”。一旦你做了一个,你会得到一个错误:
(GCC 4.8.0)
错误:“结构 Y”中未初始化的引用成员