当函数返回T&&时,std :: vector :: push_back(T&&)创建T的默认构造值。直接传递

时间:2017-04-18 23:39:16

标签: c++ c++14 rvalue-reference

我有一个返回右值参考的函数。

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

看起来即使function()返回一个rvalue-reference,vector也会推回一个默认的构造int。

有趣的是,如果我有这样的代码:

auto x = function();
v.push_back(std::move(x));

这很有效。

看来如果我只是从函数返回一个局部变量,那么RVO无论如何都会做一个复制省略。但由于我正在做一个明确的std :: move(),我正在绊倒RVO,导致返回一个临时变量。

现在,在v.push_back(function())中我调用了vector :: push_back(T&amp;&amp;)函数,导致引用对temp变量的引用。在这种情况下,它总是倾向于0而不是垃圾(我猜这是因为优化开启)。

但是,如果我尝试在局部变量中捕获function()的返回值,它可以工作,大概是因为在返回值的过程中创建的临时变量的值被复制到这个局部变量。对于未定义的行为,这看起来并不幸运。

1 个答案:

答案 0 :(得分:6)

您的函数返回对函数局部变量的引用,该变量在任何人都可以使用之前被销毁。 (使用左值引用和使用左值引用一样无效。)