According to another answer,如果参照它的表达是一个x值表达一个rvalue参考不会延长的临时的寿命。由于std::move
返回一个右值引用,调用它的表达是x值,因此在悬挂参考下面的结果:扩展一个临时的寿命与右值参考
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;
}
是否有右值引用参数,将延长临时寿命的特殊规则,不管它是prvalue或x值?或者是std::move
调用表达式只是一个xvalue,因为我们传递了一个已经是右值的东西?我不这么认为,因为无论如何它返回一个右值引用,这是一个xvalue。我很困惑。我想我错过了一些愚蠢的东西。
无关:如果函数'foo'是要复制或移动无论哪种方式,您可能希望只取按值参数,让编译器做复制或移动。 –
关于第一个示例的注释:'std :: move(get_string())'不是一个临时表达式。临时表达式是'get_string()',但是然后你施放它。因此,关于临时表达式绑定到引用的规则不再适用。 –