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

Posted

技术标签:

【中文标题】返回对临时对象成员的 const 引用【英文标题】:returning const reference to a member of a temporary object 【发布时间】:2015-10-17 11:29:35 【问题描述】:

当时会发生什么;该对象的生命周期是多少;

例如

struct temp

  T m_mine;

  static temp make()
  
    return temp();
  
;

T const & foo()

  return temp::make().m_mine;

c++98 和 c++11 的行为是什么?

【问题讨论】:

"该对象的生命周期是多少;"在调用对象struct temp 的析构函数之前,该引用一直有效。在您的示例中,您不返回临时对象,而是返回对成员变量的const 引用(即m_mine)。如果您返回对已经超出范围的对象的引用,则这是未定义的行为。 我认为编译器会忽略返回类型的 const 方面。 @101010 这不正是我要问的吗? 销毁temp 也会销毁它的成员,不是吗?所以问题实际上是临时对象何时被销毁,以及如果您之后尝试访问它会发生什么。 “未定义的行为”意味着它实际上可能看起来工作正常,也就是说,您可能能够从返回的T const & 读取数据而不会出错,在某些系统上的某些编译器中,在美好的一天。但是你为什么要这样做呢? return temp; 也是非法的,也许你的意思是return temp(); 【参考方案1】:

在这种情况下,对象的常量或裁判类型无关紧要:它只是返回对当时已不存在的对象的引用。然后使用引用是未定义的行为。

同样,如果将成员引用绑定到 const 对象,则不会延长裁判的寿命。

对象生命周期延长仅适用于将本地引用绑定到对象的情况,并且仅适用于引用const对象或右值引用的情况。


我写这篇文章时的示例代码有几个问题。请仅发布真实代码(尽可能)。并且应该粘贴,而不是重新输入。

(此外,由于现在至少有 2 个答案涉及代码问题,因此在不可能更改答案的上下文并因此使其无效的情况下更正它为时已晚。因此,获得原始帖子中的代码正确。值得记住下一个 SO 问题。)

【讨论】:

嘿伙计,我今天早上真的编了这个,没有真正的代码,而且真的不是每个人都在开源云中工作。顺便说一句,有一种方法,你可以编辑你的答案。 @g24l:的确,SO 声誉积分通常不会比您在 SO 上的时间以及您拥有一个投票支持您的社交平台的程度更重要。这里的相对代表分数仍然意味着 Dietmar 和我都是经验丰富的 SO 用户,所以我们对问题中的缺点所说的话不应该掉以轻心。此外,我们都是 comp.lang.c++.moderated Usenet 组的(现在不活跃的)版主,这意味着我们在哪些建议可以帮助人们方面拥有丰富的经验。并不是说我个人总是遵守它。 :) 但请务必考虑建议。 嗯,它说你有很多空闲时间来做建议。 :p,请考虑我的建议并获得高马(您有一个牛仔作为头像)并编辑您的帖子。您错过了协作网站的哪一部分。感谢您的建议,祝您有美好的一天。【参考方案2】:

在编译之前,您的代码在多个帐户中都不正确:

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

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

【讨论】:

嘿,谢谢您的更正,真的错过了。请在 cmets 中提出建议,而不是在答案中。竖起大拇指。

以上是关于返回对临时对象成员的 const 引用的主要内容,如果未能解决你的问题,请参考以下文章

如何编写一个返回对成员对象的引用的 const 访问器,以便可以对其进行编辑?

为啥要返回对小类成员的 const 引用?

为啥 const 方法不能返回非常量引用?

在 C++ 中将右值引用转换为临时参数到 const 左值返回的正确方法

按值返回和通过 const 引用传递时避免临时构造

C++“警告:返回对临时的引用”——但事实并非如此