Hug*_*ugo 10 c++ gcc initialization reference initializer-list
我正在玩一些无用的代码来理解成员引用的初始化,并碰到了这个:
struct A {};
struct B
{
B() : a()
{
}
const A& a;
};
Run Code Online (Sandbox Code Playgroud)
使用gcc 4.9.2编译时,上面的代码给出以下错误:
In constructor 'B::B()':
error: value-initialization of reference type 'const A&'
B() : a()
Run Code Online (Sandbox Code Playgroud)
我明白了
但是如果我在B的构造函数的初始化列表中使用统一初始化,就像这样:
struct A {};
struct B
{
B() : a{}
{
}
const A& a;
};
Run Code Online (Sandbox Code Playgroud)
它汇编很好.
所以问题是,为什么在这里使用统一初始化会改变编译结果?
我也尝试使用Microsoft Visual C++ 2013.它不编译任何版本的代码,并使用相同的错误消息:
Error 3 error C2440: 'initializing' : cannot convert from 'int' to 'const A &
Run Code Online (Sandbox Code Playgroud)
你可以在这里快速玩它:
海湾合作委员会对其解释是正确的{}.[dcl.init.list] /p3.8-9(引用N4296;之前的草稿具有相同的这两个项目符号的相对顺序):
对象或类型引用的列表初始化
T定义如下:
[省略了7个不适用的子弹]
否则,如果
T是引用类型,则引用类型的prvalue临时值T是copy-list-initialized或direct-list-initialized,具体取决于引用的初始化类型,并且引用绑定到该临时值.[ 注意:像往常一样,如果引用类型是非const类型的左值引用,则绑定将失败并且程序格式错误.- 结束说明 ]- 否则,如果初始化列表没有元素,则对象进行值初始化.
列表初始化引用命中子弹3.8,导致临时构造.3.9中的值初始化情况不适用.
引用的值初始化格式错误([dcl.init]/p9):
调用引用类型实体的默认初始化或值初始化的程序是不正确的.
但是,从N4296开始,每[class.base.init]/p8:
绑定到mem-initializer中的引用成员的临时表达式 是错误的.
这是作为CWG问题1696的结果而添加的,这是针对C++ 14的DR(缺陷报告).
预先CWG1696,标准规定(N4140 [class.temporary] /p5.1):
绑定到构造函数的ctor-initializer(12.6.2)中的引用成员的临时绑定将 持续存在,直到构造函数退出.
这意味着施工后参考将立即悬空.这可能促使CWG1696决定完全禁止此类绑定.