struct X {};
struct Y {
Y() = default;
X& x;
};
Run Code Online (Sandbox Code Playgroud)
在C++ 11中工作正常.我想知道Y :: x是如何在幕后实际初始化的?
Mic*_*urr 12
即使您明确指出Y()应该默认,编译器也有义务在某些条件下删除默认构造函数(强调添加):
8.4.2/4明确违约的职能
显式默认函数和隐式声明函数统称为默认函数,实现应为它们提供隐式定义(12.1 12.4,12.8),这可能意味着将它们定义为已删除
和
12.1/5构造函数:
...
...如果出现以下情况,则将类X的默认默认构造函数定义为已删除:
- 任何没有大括号或等号初始化程序的非静态数据成员都是引用类型
但是,除非您实际尝试使用它,否则定义已删除的函数或构造函数并不是错误:
8.4.3/2删除的定义
除了声明它之外,隐式或显式引用已删除函数的程序是不正确的.
For*_*veR 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;
Run Code Online (Sandbox Code Playgroud)
当你声明user-defined构造函数时,它只是一个空函数,有错误,没有创建对象.
迈克尔伯尔是对的.隐式默认的构造函数非常好.我可以看到,这里的诊断没有问题.