我可以这样做:
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?
}
代理-5的生命周期是否仍然延长?或r
悬挂参考?
答案 0 :(得分:5)
这是一个悬垂的参考。来自[class.temporary] / 4-5:
有两种情况下,临时表在不同于完整表达结束时被摧毁。 第一个上下文是调用默认构造函数[...]
第二个上下文是引用绑定到临时的。引用所在的临时值 绑定或临时,即绑定引用的子对象的完整对象仍然存在 对于参考的生命周期,除了:
- 临时绑定到构造函数的 ctor-initializer [...]
中的引用成员- 函数调用(5.2.2)中与引用参数的临时绑定持续,直到完成 包含调用的完整表达式。
- [...]
5
一直持续到包含调用的完整表达式完成,也就是说:
const int &r = fun(5);
// <== no more 5
答案 1 :(得分:4)
不,我不相信。您将5
绑定到fun
的参数的引用,因此只要该参数持续,它就会持续。该参数仅持续调用fun
的持续时间。
在this previous question中探讨了相关的标准文本。