5
struct X {};

struct Y { 
    Y() = default;
    X& x;
};

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

4

3 回答 3

13

即使您明确指出Y()应该默认,编译器也有义务在某些条件下删除默认构造函数(强调添加):

8.4.2/4 显式默认函数

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

12.1/5 构造函数:

...

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

  • 任何没有大括号或等号初始化器的非静态数据成员都是引用类型

但定义一个已删除的函数或构造函数并不是错误,除非您实际尝试使用它:

8.4.3/2 删除的定义

隐式或显式引用已删除函数(而不是声明它)的程序是格式错误的。

于 2013-04-18T07:24:07.397 回答
11

它不能在任何主要编译器中编译。它将编译,直到创建类型的对象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构造函数时,它只是一个空函数,会出现错误,而不会创建对象。

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

于 2013-04-18T07:03:58.923 回答
8

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

(GCC 4.8.0)

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

于 2013-04-18T07:05:01.023 回答