我具有返回rvalue参考的函数。
auto function() -> int&& {
int x{10};
std::cout << x << std::endl; // to check the value of x
return std::move(x);
}
现在,当我使用以下代码时:
std::cout << function() << std::endl;
std::vector<int> v;
v.push_back(function());
std::cout << v[0] << std::endl;
这将导致以下输出
10
0
看起来即使函数((返回rvalue-reference,vector,向后推回默认构造的int。
有趣的是,如果我有这样的代码:
auto x = function();
v.push_back(std::move(x));
这很好。
看来,如果我只是从函数中返回了一个局部变量,那么RVO还是会进行复制elision。但是,由于我正在做explicity std :: move((我正在绊倒RVO,从而返回了一个临时变量。
现在,在v.push_back(function(((中,我正在调用vector :: push_back(t&amp;&amp;(函数,从而引用了对temp变量的引用。在这种情况下,它总是往往是0而不是垃圾(我猜这是由于优化的打开(。
但是,如果我尝试在局部变量中捕获函数((的返回值,则可能是因为在返回值过程中创建的温度变量的值会复制到此局部变量。这看起来不像我对不确定的行为感到幸运。
您的函数返回对功能 - 本地变量的引用,该变量在任何人都可以使用它之前已被破坏。(使用RVALUE参考与使用LVALUE参考一样,这就像无效。(