std::move 不处理 RValue 引用函数

std::move Not Working on RValue Reference Function

在尝试学习 std::move 和右值引用时,我遇到了以下问题:

int _tmain(int argc, _TCHAR* argv[])
{
    std::vector<int> vecNumbers;
    vecNumbers.push_back(10);
    vecNumbers.push_back(20);

    foo(std::move(vecNumbers));

    std::cout<<"After Move \n";
    std::cout<<"size:"<<vecNumbers.size()<<"\n";

    return 0;
}

void foo(  std::vector<int> &&value)
{
    std::cout<<"size in Function:"<<value.size()<<"\n";
}

输出

size in Function:2
After Move
size:2

vector 上调用 move 后,我期望大小为 0,但这里它仅作为参考移动。谁能解释一下这里发生了什么。

您对 move 的假设是错误的:

std::move is used to indicate that an object t may be "moved from", i.e. allowing the efficient transfer of resources from t to another object.

In particular, std::move produces an xvalue expression that identifies its argument t. It is exactly equivalent to a static_cast to an rvalue reference type.

这并不意味着向量的大小应该在您的代码中变为零。

std::move 仅转换为右值引用。

foo 将 Rvalue ref 设为 vector<int>。通过 move(vecNumbers) 你得到 vector<int>&&。在 foo 中,您只需访问在 main 中定义的 vecNumbers。您没有执行任何更改此向量内容的操作。

如果你真的想移动(窃取)vecNumbers 的内容,你必须调用移动构造函数或移动赋值运算符。在 foo 中你可以这样做:

void foo(  std::vector<int>&& value)
{
    std::vector<int> v1{std::move(value)}; // invoke move ctor which steals content of value
    std::cout<<"size in Function:"<<value.size()<<"\n";
}

或者您可以将 foo 的签名更改为:

void foo(std::vector<int> value) {

}

那么当你打电话时

foo(std::move(vecNumbers))

调用 vector<T> 的移动构造函数,将 vecNumbers 移动到 foo.

中的 value