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

abh*_*jit -2 c++ rvalue-reference c++14

我有一个返回右值引用的函数.

auto function() -> int&& {
    int x{10};
    std::cout << x << std::endl; // to check the value of x
    return std::move(x);
}
Run Code Online (Sandbox Code Playgroud)

现在,当我使用以下代码时:

std::cout << function() << std::endl;
std::vector<int> v;
v.push_back(function());
std::cout << v[0] << std::endl;
Run Code Online (Sandbox Code Playgroud)

这导致以下输出

10
0
Run Code Online (Sandbox Code Playgroud)

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

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

auto x = function();
v.push_back(std::move(x));
Run Code Online (Sandbox Code Playgroud)

这非常有效.

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

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

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

asc*_*ler 6

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