移动后重用变量
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::move
将 v
转换为 rvalue
,它绑定到引用参数 v
(因此它引用参数 [= test2
的 13=],即在 main
中定义的对象 v
)。没有构造新的 vector
对象,也没有调用移动构造函数或移动赋值运算符。
你的代码是正确的,但是你交流的意图是错误的。
如果有人看到函数的声明test
他会认为在调用函数时他放弃了他正在传递的变量的所有权,因为变量将被移动
一般来说,在调用 std::move(v)
后,您不应重复使用 v
。
在这种情况下您应该做的是将 test
声明为 void test(std::vector<int>& v)
并且您应该只使用 test(v)
来调用它。
这样一来就明明test
会修改v
,但是你以后就可以用了
做以下事情可以吗?下面的代码在移动它之后在循环(下一次迭代)中再次使用向量 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::move
将 v
转换为 rvalue
,它绑定到引用参数 v
(因此它引用参数 [= test2
的 13=],即在 main
中定义的对象 v
)。没有构造新的 vector
对象,也没有调用移动构造函数或移动赋值运算符。
你的代码是正确的,但是你交流的意图是错误的。
如果有人看到函数的声明test
他会认为在调用函数时他放弃了他正在传递的变量的所有权,因为变量将被移动
一般来说,在调用 std::move(v)
后,您不应重复使用 v
。
在这种情况下您应该做的是将 test
声明为 void test(std::vector<int>& v)
并且您应该只使用 test(v)
来调用它。
这样一来就明明test
会修改v
,但是你以后就可以用了