According to another answer时,如果引用临时值的表达式是x值表达式,则右值引用不会延长临时值的生存期。因为std::move
返回一个右值引用,所以调用它的表达式是一个x值,所以下面的结果是一个悬空引用:
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值,因为我们传递给它的东西已经是一个右值?我不这么认为,因为它会返回一个右值引用,这是一个x值。我对此感到困惑。我想我漏掉了一些愚蠢的东西。
发布于 2012-11-27 21:31:03
这里不需要延长任何生命周期:所讨论的对象一直持续到main
结束,也就是在foo
结束之后。
发布于 2012-11-27 21:33:38
您的第二个示例不是传递对临时变量的引用,而是传递对变量s
的引用,该变量将一直持续到main()
的末尾。
如果是(例如foo(std::move(get_string()));
),则临时表达式的生命周期将持续到完整表达式的末尾-在函数返回之后。因此,在foo
中使用它是非常安全的。只有当foo
存储了指向其参数的引用/指针,然后其他对象试图使用它时,才会有危险。
https://stackoverflow.com/questions/13585285
复制相似问题