struct X {};
struct Y {
Y() = default;
X& x;
};
在C ++ 11中运行良好。我想知道Y :: x是如何在幕后实际初始化的?
答案 0 :(得分:12)
即使您明确指出Y()
应该是默认的,编译器也有义务在某些条件下删除默认构造函数(强调添加):
8.4.2 / 4明确违约的职能
明确默认的函数和隐式声明的函数 统称为违约函数,并实施 为它们提供隐式定义(12.1 12.4,12.8),可能 意味着将它们定义为已删除
和
12.1 / 5建设者:
...
...如果出现以下情况,则将类X的默认默认构造函数定义为已删除:
- 任何没有大括号或等于初始化程序的非静态数据成员都是引用类型
但是,除非您真正尝试使用它,否则定义已删除的函数或构造函数并不是错误:
8.4.3 / 2已删除的定义
隐式或明确引用已删除函数的程序, 除了宣布之外,还有不良形式。
答案 1 :(得分:10)
它不会在任何主要编译器中编译。它将编译,直到创建类型为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
构造函数(它只是空函数)时,会出现错误,而不会创建对象。
答案 2 :(得分:8)
如果您不制作Y对象,它“有效”。一旦你做了一个你会得到一个错误:
(GCC 4.8.0)
错误:'struct Y'中未初始化的引用成员