返回临时对象成员的const引用

3

当返回一个临时对象成员的const引用时会发生什么?那个对象的生命周期是多久?

例如:

struct temp
{
  T m_mine;

  static temp make()
  {
    return temp();
  }
};

T const & foo()
{
  return temp::make().m_mine;
}

c++98和c++11之间的行为有何不同?


“那个对象的生命周期是多久?”该引用在 struct temp 对象的析构函数被调用之前都是有效的。在您的示例中,您并没有返回一个临时对象,而是返回了一个对成员变量(即 m_mine)的 const 引用。如果您返回对已经超出作用域的对象的引用,则这是未定义的行为。 - 101010
销毁temp也会销毁它的成员,是吗?所以问题实际上是临时对象何时被销毁,如果您在之后尝试访问它会发生什么。 "未定义行为"意味着它可能实际上看起来工作正常,也就是说,在某些编译器、某些系统或好天气下,您可能能够从返回的 T const&中读取数据而没有错误。但您为什么要这样做呢? - David K
这段代码是非法的,因此没有任何行为。 - M.M
@M.M 确实,正在进行更正。谢谢。 - g24l
1
return temp; 也是非法的,也许你的意思是 return temp(); - M.M
显示剩余5条评论
2个回答

2
在这种情况下,对象或引用类型的const性质并不重要:它只是返回对一个已经不存在的对象的引用。在使用引用时会导致未定义的行为。同样地,如果将成员引用绑定到一个const对象上也不会延长其生命周期。对象的生命周期延长仅适用于将局部引用绑定到对象的情况,并且只适用于对const对象或rvalue引用的引用情况。

兄弟,其实这只是我今天早上编的,没有真正的代码,而且并不是每个人都在开源云上工作。顺便说一句,你可以编辑你的回答。 - g24l
@g24l:确实,SO声望分通常只能说明你在SO上活跃的时间以及社交平台给你投票的程度。但是,这里的相对声望得分意味着Dietmar和我都是经验丰富的SO用户,因此我们对问题的缺点所说的话不应该轻易被忽视。此外,我们两个人都是(现在已经不活跃的)comp.lang.c++.moderated Usenet组的版主,这意味着我们在帮助人们提出建议方面有一些广泛的经验。虽然我个人并不总是遵守它。 :) 但请考虑这些建议。 - Cheers and hth. - Alf
好的,它说你有很多空闲时间来提建议。:p,请考虑我的建议,下马并编辑你的帖子。你错过了协作网站的哪一部分?感谢建议,祝你有愉快的一天。 - g24l

0

在编译之前,你的代码就存在多个错误:

  • 类型声明后至少缺少一个分号
  • 代码使用非static成员函数make(),就像它是一个static函数一样

一旦解决了这些问题:返回的引用指向一个对象的子对象,在执行return语句之后并且在任何东西获取它之前,该对象就被销毁了。也就是说,存在一个过时的引用返回。对此引用的任何访问都将导致未定义的行为。如果你幸运的话,程序会在这一点崩溃。如果你不幸的话,它可能会做一些你希望发生的事情。例如,它可能会在程序展示给客户或投资者时决定显示侮辱。


哥们儿,感谢你的纠正,真的错过了那个。请把建议放在评论中,而不是答案中。点赞。 - g24l

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接