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

lal*_*itm 4 c++ c++11

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构造函数时,它只是一个空函数,有错误,没有创建对象.

迈克尔伯尔是对的.隐式默认的构造函数非常好.我可以看到,这里的诊断没有问题.


Rap*_*ptz 8

如果你不制作Y对象,它"有效".一旦你做了一个你会得到一个错误:

(GCC 4.8.0)

错误:'struct Y'中未初始化的引用成员