【发布时间】:2015-08-03 20:50:08
【问题描述】:
给定:
struct hurg { ... };
hurg get_hurg() { return hurg(); }
hurg&& get_mhurg() { return hurg(); }
我对@987654321@ 的理解表明以下是不是未定义的行为(编辑:感谢答案,事实证明我错了,get_mhurg() 示例是 未定义的行为):
{
const hurg& a = get_hurg();
hurg&& b = get_hurg();
const hurg& c = get_mhurg();
hurg&& d = get_mhurg();
// do stuff with a, b, c, d
}
// a, b, c, d are now destructed
即get_hurg()和get_mhurg()返回的临时hurg对象的生命周期延长到作用域结束。
但是,在(来自here的函数)的情况下:
template <typename T>
auto id(T&& x) -> decltype(auto) { return decltype(x)(x); }
像这样使用它:
{
const hurg& x = id(hurg());
// the hurg() 'x' refers to is already destructed
hurg&& y = id(hurg());
// the hurg() 'y' refers to is already destructed
// undefined behavior: use 'x' and 'y'
}
在这种情况下,hurg 的生命周期没有延长。
一般来说,什么决定了临时对象的生命周期何时延长?并且,特别是,何时将函数的结果绑定到 const lvalue ref 或 rvalue ref 是安全的?
更具体地说,id 案例中究竟发生了什么?
【问题讨论】:
标签: c++ c++11 reference rvalue-reference lifetime