【问题标题】:lifetime extension for function taking parameter by const& and returning by const&通过 const 获取参数并由 const 返回的函数的生命周期延长
【发布时间】:2019-05-16 10:29:51
【问题描述】:

在 C++ 中,当您具有以下条件时:

std::string get_string();
std::string const& v = get_string();

从 get_string() 返回的临时对象的生命周期延长到引用 v 的相同生命周期;

如果我有以下情况:

std::string const& get_string(std::string const& p) {
  return p;
}

std::string const& v = 
get_string(std::string{"Hello"});

临时的生命周期是否延长?还是这是一个悬空的参考;

我的理解是临时绑定到 p 的生命周期 并且仅在函数的持续时间内存在,并且对临时的辅助引用不会延长生命周期。

预期的结果是什么?

【问题讨论】:

标签: c++ reference lifetime


【解决方案1】:

是的,临时的生命周期不会进一步延长;在完整的表达式之后,引用 v 变得悬空。

std::string const& v = get_string(std::string{"Hello"});
// v becomes dangled now

我的理解是临时绑定到 p 的生命周期,并且只在函数的持续时间内存在

确切地说,temporary 一直存在到完整表达式的末尾,而不仅仅是函数的持续时间。

  • 在函数调用中与引用参数的临时绑定一直存在,直到包含该函数调用的完整表达式结束:如果函数返回的引用比完整表达式的寿命长,则它成为悬空引用。

一般来说,临时的生命周期不能通过“传递”来进一步延长:第二个引用,从临时绑定的引用初始化,不会影响它的生命周期。

这意味着像auto sz = get_string(std::string{"Hello"}).size(); 这样的东西很好。

【讨论】:

  • 所以这是因为它绑定到 p 并且在参数列表中并且在调用结束时无法扩展到 v。所以 v 悬空是吗?
  • @BlairDavidson 我认为这种思维方式是对的;我在回答中添加了一些引号。
  • 奇怪的是这在 gcc 中有效,所以我有点困惑。
  • @BlairDavidson 对悬空引用的取消引用导致 UB;世事皆可能。即使它看起来运作良好。
  • 完整表达式是在赋值运算符 = 的右侧还是在赋值运算符的左侧和右侧
猜你喜欢
  • 2023-03-21
  • 2019-01-31
  • 2017-09-07
  • 2020-03-29
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多