考虑以下内容。
#include <string>
using std::string;
string middle_name () {
return "Jaan";
}
int main ()
{
string&& danger = middle_name(); // ?!
return 0;
}
这不会计算任何东西,但它编译时没有错误,并演示了一些我觉得令人困惑的东西:danger
是一个悬空引用,不是吗?
最佳答案
Do rvalue references allow dangling references?
如果您的意思是“是否可以创建悬空右值引用”,那么答案是肯定的。但是,您的示例
string middle_name () {
return "Jaan";
}
int main()
{
string&& nodanger = middle_name(); // OK.
// The life-time of the temporary is extended
// to the life-time of the reference.
return 0;
}
完全没问题。同样的规则也适用于 this example (Herb Sutter 的文章)也很安全。如果您使用 pure 右值 初始化引用,则临时对象的生命周期会延长到引用的生命周期。不过,您仍然可以生成悬空引用。例如,这不再安全了:
int main()
{
string&& danger = std::move(middle_name()); // dangling reference !
return 0;
}
因为 std::move
返回一个 string&&
(这不是一个纯 rvalue) 延长临时生命周期的规则不适用。这里,std::move
返回一个所谓的xvalue。 xvalue 只是一个未命名的右值引用。因此,它可以引用任何东西,如果不查看函数的实现,基本上不可能猜出返回的引用所指的内容。
关于c++ - 右值引用是否允许悬空引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3716277/