初始化列表中的const引用成员的初始化

时间:2015-02-25 11:20:04

标签: c++ gcc reference initialization initializer-list

我正在玩一些无用的代码来理解成员引用的初始化,并且碰到了这个:

struct A {};

struct B
{
    B() : a()
    {
    }

    const A& a;
};

使用gcc 4.9.2编译时,上面的代码会出现以下错误:

In constructor 'B::B()':
error: value-initialization of reference type 'const A&'
  B() : a()

我理解。

但是如果我在B的​​构造函数的初始化列表中使用统一初始化,就像这样:

struct A {};

struct B
{
    B() : a{}
    {
    }

    const A& a;
};

它汇编得很好。

所以问题是,为什么在这里使用统一初始化会改变编译结果?

我也尝试使用Microsoft Visual C ++ 2013。 它不编译任何版本的代码,并使用相同的错误消息:

Error 3 error C2440: 'initializing' : cannot convert from 'int' to 'const A & 

你可以在这里快速玩一下:

http://ideone.com/7f2t8I

1 个答案:

答案 0 :(得分:6)

海湾合作委员会对{}的解释是正确的。 [dcl.init.list] /p3.8-9(引用N4296;早期的草稿与这两个子弹的相对排序相同):

  

对象或类型T的引用的列表初始化定义为   如下:

     
      
  • [省略了7个不适用的子弹]

  •   
  • 否则,如果T是引用类型,则T引用的类型的prvalue临时值是copy-list-initialized或   direct-list-initialized,取决于初始化的类型   引用,引用绑定到临时。 [注意:   像往常一样,绑定将失败,程序是不正确的,如果   reference类型是对非const类型的左值引用。 - 结束记录   ]

  •   
  • 否则,如果初始化列表没有元素,则对象将进行值初始化。
  •   

列表初始化引用命中子弹3.8,导致构造临时。 3.9中的值初始化情况不适用。

引用的值初始化格式不正确([dcl.init] / p9):

  

调用默认初始化或的程序   参考类型实体的值初始化是不正确的。


但是,从N4296开始,按[class.base.init] / p8:

  

绑定到a中引用成员的临时表达式    mem-initializer 格式不正确。

这是CWG issue 1696的结果,这是针对C ++ 14的DR(缺陷报告)。

前CWG1696,标准规定(N4140 [class.temporary] /p5.1):

  

临时绑定到构造函数中的引用成员    ctor-initializer (12.6.2)会一直存在,直到构造函数退出。

这意味着施工后参考将立即悬空。这可能促使CWG1696决定完全禁止此类绑定。