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

时间:2013-04-18 07:00:36

标签: c++ c++11

struct X {};

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

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

3 个答案:

答案 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'中未初始化的引用成员