根据另一个答案,如果引用它的表达式是 xvalue 表达式,则右值引用不会延长临时变量的生命周期。由于std::move
返回一个右值引用,调用它的表达式是一个 xvalue,所以下面的结果是一个悬空引用:
int main()
{
std::string&& danger = std::move(get_string()); // dangling reference !
return 0;
}
没关系。在这里std::move
没有意义;它已经是一个右值。
但这里是我画一个空白的地方。这与将 xvalue 表达式作为参数传递、完全标准使用std::move
和右值引用有何不同?
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;
}
右值引用参数是否有特殊规则可以延长临时变量的生命周期,无论它是纯右值还是 xvalue?还是std::move
调用表达式只是一个 xvalue,因为我们传递了一些已经是右值的东西?我不这么认为,因为它无论如何都会返回一个右值引用,这是一个 xvalue。我在这里很困惑。我想我错过了一些愚蠢的东西。