According to another answer,如果引用它的表达式是xvalue表达式,则右值引用不会延长临时值的生命周期。由于std::move
返回一个右值引用,因此调用它的表达式是一个xvalue,所以下面会产生一个悬空引用:
int main()
{
std::string&& danger = std::move(get_string()); // dangling reference !
return 0;
}
没关系。 std::move
在这里没有意义;它已经是一个左值。
但是我在这里画空白。将xvalue表达式作为参数传递,完全标准地使用std::move
和rvalue引用,这有何不同?
void foo(const std::string& val);
// More efficient foo for temporaries:
void foo(std::string&& val);
int main()
{
std::string s;
foo(std::move(s)); // Give up s for efficiency
return 0;
}
rvalue引用参数是否有一个特殊规则可以延长临时值的生命周期,无论它是prvalue还是xvalue?或者std::move
调用表达式只是一个x值,因为我们传递了一个已经是右值的东西?我不这么认为,因为它总是返回一个右值引用,这是一个xvalue。我在这里很困惑。我想我错过了一些愚蠢的事情。
答案 0 :(得分:8)
你的第二个例子是没有传递对临时的引用,它传递对变量s
的引用,该引用一直持续到main()
的结尾。
如果是(例如foo(std::move(get_string()));
),则临时的生命周期将持续到完整表达式结束 - 函数返回后。因此在foo
内使用它是非常安全的。如果foo
存储了一个引用/指针到它的参数,那么只有一个危险,而其他东西试图在以后使用它。
答案 1 :(得分:7)
此处无需延长任何生命周期:有问题的对象会持续到main
结束,这是foo
结束之后。