C++ C+中的引用初始化+;11默认构造函数

C++ C+中的引用初始化+;11默认构造函数,c++,c++11,C++,C++11,在C++11中工作良好。我想知道Y::x实际上是如何在幕后初始化的?它不在任何主要编译器中编译。它将编译,直到创建类型为Y的对象 如果您创建类型为Y的对象,则将 struct X {}; struct Y { Y() = default; X& x; }; 当您声明用户定义的构造函数(它只是一个空函数)时,会出现错误,而不会创建对象 迈克尔·伯尔是对的。隐式默认构造函数工作得非常好。正如我所看到的,这里的诊断没有问题。如果不创建Y对象,它“工作”。一旦你做了一个,你

在C++11中工作良好。我想知道Y::x实际上是如何在幕后初始化的?

它不在任何主要编译器中编译。它将编译,直到创建类型为
Y
的对象

如果您创建类型为
Y
的对象,则将

struct X {};

struct Y { 
    Y() = default;
    X& x;
};
当您声明
用户定义的
构造函数(它只是一个空函数)时,会出现错误,而不会创建对象

迈克尔·伯尔是对的。隐式默认构造函数工作得非常好。正如我所看到的,这里的诊断没有问题。

如果不创建Y对象,它“工作”。一旦你做了一个,你会得到一个错误:

(通用条款4.8.0)

错误:“结构Y”中未初始化的引用成员


即使您明确指出
Y()
应为默认值,编译器仍有义务在某些条件下删除默认构造函数(重点添加):

8.4.2/4明确默认的函数

显式默认函数和隐式声明函数是 统称为默认函数,其实现应 为它们提供隐式定义(12.1、12.4、12.8),可能 表示将其定义为已删除

12.1/5施工人员:

。。。在以下情况下,类X的默认构造函数被定义为已删除:

  • 没有大括号或相等初始值设定项的任何非静态数据成员都属于引用类型
但定义已删除的函数或构造函数不是错误,除非您实际尝试使用它:

8.4.3/2删除的定义

隐式或显式引用已删除函数的程序, 除了声明它,它的格式是错误的


那不可能编译。一个普通的默认构造函数默认初始化所有成员,但引用不能默认初始化。@Alex它对“works”的某些值有效。@KerrekSB:所以我想这归结为实现质量的问题,希望编译器能够尽快诊断它@马蒂厄姆。这是一个味道的问题,如果这应该被诊断<代码>默认值根据标准意味着“执行生成的默认构造函数的任何操作—(即使这意味着隐式删除)”。但是,许多编译器警告隐式删除,如果构造函数显式默认,imo应该继续这样做。@KerrekSB它会编译,因为在C++03中,即使是显式默认的构造函数也只有在实际调用时才会生成。我认为12.1/6中还有一点很重要:默认构造函数是在使用ODR时定义的,而不是在其他情况下定义的。
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;