首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >初始化程序列表中const引用成员的初始化

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

Stack Overflow用户
提问于 2015-02-25 11:20:03
回答 1查看 3.1K关注 0票数 10

为了理解成员引用的初始化,我使用了一些无用的代码,并碰到了这样的情况:

代码语言:javascript
复制
struct A {};

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

    const A& a;
};

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

代码语言:javascript
复制
In constructor 'B::B()':
error: value-initialization of reference type 'const A&'
  B() : a()

我能理解。

但是,如果在B的构造函数初始化程序列表中使用统一初始化,如下所示:

代码语言:javascript
复制
struct A {};

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

    const A& a;
};

它编译得很好。

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

我还在微软的VisualC++ 2013中尝试了这一点。它不使用相同的错误消息编译这两个版本的代码:

代码语言:javascript
复制
Error 3 error C2440: 'initializing' : cannot convert from 'int' to 'const A & 

你可以在这里玩一玩:

http://ideone.com/7f2t8I

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-25 11:57:35

GCC对{}的解释是正确的。dcl.init.list/p3.8-9 (引用N4296;前面的草稿与这两个符号的相对顺序相同):

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

  • 省略7个不适用的子弹
  • 否则,如果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决定完全禁止这种绑定的动机。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28717682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档