哪个标准措辞告诉我们 ref-to-const 临时生命周期扩展仅“有效一次”?

2023-12-06

我在聊天中看到了以下示例:

#include <iostream>
struct foo { ~foo() { std::cout << "destroying!\n"; } };
const foo& func(const foo& a, const foo&) { return a; }

int main()
{
  foo x;
  const foo& y = func(foo(), x);
  std::cout << "main\n";
}

Output:

destroying!
main
destroying!

这似乎证明了foo暂时不会扩展到整个main,即使它绑定到一个 ref-to-const在那个范围内。

那么,据推测,寿命延长仅“有效一次”;也就是说,它适用于func的参数已初始化,但不通过连续绑定传递。

我的解释正确吗?如果是这样(并且如果有任何单独的段落直接适用)定义此行为的标准措辞是什么?


你几乎是对的。这种行为实际上具体来自函数调用,而不是因为任何类型的“仅有效一次”规则。

以下是整个生命周期扩展“功能”的措辞,相关规则以粗体强调:

[C++11: 12.2/5]: [..]引用所绑定到的临时对象或作为引用所绑定到的子对象的完整对象的临时对象在引用的生命周期内持续存在except:

  • [..]
  • 函数调用 (5.2.2) 中对引用参数的临时绑定将持续存在,直到包含调用的完整表达式完成为止。
  • [..]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

哪个标准措辞告诉我们 ref-to-const 临时生命周期扩展仅“有效一次”? 的相关文章

随机推荐