C++ 通过引用传递的临时函数的生存期
我可以这样做:C++ 通过引用传递的临时函数的生存期,c++,C++,我可以这样做: const int &i = 5; 并将临时的生存期延长到i的生存期 但是呢 const int &fun (const int &i){ return i; } int main () { const int &r = fun(5); // Can I use r here? } proxy-5的生存期是否仍在延长?或者r是一个悬而未决的参考吗?不,我不这么认为。您将5绑定到作为fun参数的引用,因此该参数的持续时间
const int &i = 5;
并将临时的生存期延长到i
的生存期
但是呢
const int &fun (const int &i){
return i;
}
int main () {
const int &r = fun(5);
// Can I use r here?
}
proxy-5的生存期是否仍在延长?或者
r
是一个悬而未决的参考吗?不,我不这么认为。您将5
绑定到作为fun
参数的引用,因此该参数的持续时间与该参数的持续时间相同。该参数仅在调用fun
期间有效
相关标准文本已在中探讨。这是一个悬而未决的参考。从[class.temporary]/4-5开始: 在两种语境中,时间词在不同于完整表达结尾的地方被销毁。 第一个上下文是调用默认构造函数[…] 第二个上下文是将引用绑定到临时上下文。引用的临时对象 绑定的或作为引用绑定到的子对象的完整对象的临时对象将持续存在 在引用的有效期内,以下情况除外:
- 临时绑定到构造函数的ctor初始值设定项中的引用成员[…]
- 函数调用(5.2.2)中参考参数的临时绑定持续,直到 包含调用的完整表达式
- [……]
5
会一直存在,直到包含调用的完整表达式完成,也就是说:
const int &r = fun(5);
// <== no more 5
const int&r=fun(5);
//5是右值。函数将为您创建一个临时文件,但在函数结束后将其删除。是的,这是一个悬而未决的参考。可能几乎重复了@LightnessRacesinOrbit为什么“几乎”?巴里:我认为这是一个“触及相同的主题,基本上问相同的问题,但不是一个‘重复’”的问题。情况:P既然原来的问题是我的,我不想让它看起来不合适。嗯,“重复”有回答我问题的答案。但我不会想出“只工作一次”的措辞。