为了理解成员引用的初始化,我使用了一些无用的代码,并碰到了这样的情况:
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;
};它编译得很好。
所以问题是,为什么在这里使用统一初始化会改变编译结果?
我还在微软的VisualC++ 2013中尝试了这一点。它不使用相同的错误消息编译这两个版本的代码:
Error 3 error C2440: 'initializing' : cannot convert from 'int' to 'const A & 你可以在这里玩一玩:
http://ideone.com/7f2t8I
发布于 2015-02-25 11:57:35
GCC对{}的解释是正确的。dcl.init.list/p3.8-9 (引用N4296;前面的草稿与这两个符号的相对顺序相同):
列表-对象的初始化或
T类型的引用定义如下:
T是引用类型,则T引用的类型的prvalue临时值是复制列表初始化或直接列表初始化,这取决于引用的初始化类型,并且引用绑定到该临时引用。注意:与往常一样,如果引用类型是对非const类型的lvalue引用,则绑定将失败,并且程序的格式不正确。-end注记列表-初始化引用会命中项目3.8,从而导致临时构造。3.9中的值初始化情况不适用.
值-引用的初始化格式不正确(dcl.init/p9):
调用引用类型实体的默认初始化或值初始化的程序格式不正确.
但是,在N4296中,每个N4296.base.init/p8:
绑定到mem初始化器中的引用成员的临时表达式不正确。
这是CWG第1696期的结果,它是针对C++14的DR (缺陷报告)。
在CWG1696之前,标准规定(N4140 N4140.临时/p5.1):
临时绑定到构造函数的ctor-初始化器(12.6.2)中的引用成员,直到构造函数退出为止。
这意味着在施工后,参考资料将立即悬空。这大概是CWG1696 1696决定完全禁止这种绑定的动机。
https://stackoverflow.com/questions/28717682
复制相似问题