移动后重用变量

Reuse variable after move

做以下事情可以吗?下面的代码在移动它之后在循环(下一次迭代)中再次使用向量 v。

#include <iostream>
#include <string>
#include <vector>

using namespace std;

void test(vector<int>&& v) {
    cout << v.size() << endl;
    v.push_back(5);
}

void test2(vector<int>& v) {
    for (int i = 0; i < 4; i++) {
        test(move(v));
    }
}

int main()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    test2(v);    
}

std::move只是将传递给右值的参数转换,但本身并不执行移动操作。

给定 test(move(v));std::movev 转换为 rvalue,它绑定到引用参数 v(因此它引用参数 [= test2 的 13=],即在 main 中定义的对象 v)。没有构造新的 vector 对象,也没有调用移动构造函数或移动赋值运算符。

你的代码是正确的,但是你交流的意图是错误的。

如果有人看到函数的声明test他会认为在调用函数时他放弃了他正在传递的变量的所有权,因为变量将被移动

一般来说,在调用 std::move(v) 后,您不应重复使用 v

在这种情况下您应该做的是将 test 声明为 void test(std::vector<int>& v) 并且您应该只使用 test(v) 来调用它。 这样一来就明明test会修改v,但是你以后就可以用了