首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >值-常量成员引用的初始化

值-常量成员引用的初始化
EN

Stack Overflow用户
提问于 2010-11-11 03:21:01
回答 3查看 4K关注 0票数 6

我正在查看以下形式的代码:

代码语言:javascript
复制
class foo
{
  public:
    foo() {}

  //...
};

class bar
{
  public:
    bar() : ref() {}

  private:
    const foo &ref;
};

以这种方式使用临时值初始化引用是否正确?我知道初始化const引用是可能的,它是一个带有临时变量的局部变量,这样做可以延长临时变量的生命周期,例如

代码语言:javascript
复制
const foo &tmp = funcThatReturnsByValue(); //OK

然而,对相关initialize reference in initialization list的一个回答表明,“短期”和“长期”引用之间存在差异,并且如上所述初始化ref是未定义的行为(即使refconst引用)。

在标准12.2.5中,部分地说,“临时绑定到构造函数的ctor-initializer中的引用成员,直到构造函数退出。”这是在描述这种情况吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-11 03:34:10

此代码的格式不正确。不能对引用进行默认初始化或取值初始化。

如果您实际上在ref()中有一个表达式,那么是的,12.2.5将适用,并且当构造函数退出时,临时表达式将被销毁。

票数 4
EN

Stack Overflow用户

发布于 2010-11-11 05:06:48

您的示例不是创建临时的-为此,您需要更改为:

代码语言:javascript
复制
    bar() : ref(foo()) {} 

现在,您正在将引用绑定到一个临时对象,该临时对象将在构造函数结束时被销毁。你的引用将是无效的,这不是一件好事。

票数 2
EN

Stack Overflow用户

发布于 2010-11-11 04:40:43

我猜你想做的是:

代码语言:javascript
复制
bar() : ref(foo()) {}

但是,不要天真地认为临时值的生命周期是延长的,直到有引用它。不,它实际上不是。所以,不管是否常量,你都应该用一个普通的对象来初始化引用。

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

https://stackoverflow.com/questions/4148202

复制
相关文章

相似问题

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