1

可以进行以下操作吗?以下代码在移动后在循环(下一次迭代)中再次使用向量 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);    
}
4

2 回答 2

2

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

给定test(move(v));std::move转换vrvalue,它被绑定到引用参数v(因此它引用 的参数vtest2即 中v定义的对象main)。不构造新vector对象,也不调用移动构造函数或移动赋值运算符。

于 2021-05-22T05:24:22.017 回答
2

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

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

一般来说,调用后std::move(v)你不应该重用v.

在这种情况下你应该做的是声明testvoid test(std::vector<int>& v),你应该只用test(v). 这样很明显test会修改v,但是以后可以使用。

于 2021-05-22T09:16:48.367 回答