问题描述
// testing the move semantic when passing
// argument to be modified without copying
void process_copy( std::vector<int>&& aVec)
{
std::cout << "Move semantic\n";
aVec.push_back(42);
}
现在在主函数中,如下:
int main()
{
std::vector<int> w_vec = {1,2,3,4,5};
process_copy( std::move(w_vec));
}
我希望 w_vec
现在是空的,因为我通过移动转换(将左值转换为右值)传递了它。但结果是 w_vec
现在包含 6 个元素(42 已添加到向量中)。
我想念的东西? std::vector
是可移动的物体吗?
解决方法
我的 CoreCpp 2019 T 恤的图片可能与此处相关。
这是前面。
有趣的是,std::move
的这种行为有点令人惊讶,even for Howard Hinnant himself 是右值和移动语义背后的人。不过他得到了非常彻底的答复there。
您可能缺少的是,您只是将右值引用绑定到您传递的向量;您根本没有移动任何矢量对象。
import os
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID" # see issue #152
os.environ["CUDA_VISIBLE_DEVICES"]="3"
参数的类型为 process_copy()
,即对 std::vector<int>&&
的右值引用:
std::vetor<int>
在调用 void process_copy(std::vector<int>&& aVec)
时使用 std::move()
,如下所示:
process_copy()
您只是使将此引用(即 process_copy(std::move(w_vec));
的参数 process_copy()
)绑定到参数(即向量 aVec
)成为可能。也就是说,以下内容无法编译:
w_vec
因为您无法将右值引用 (process_copy(w_vec);
) 绑定到 左值 (aVec
)。
如果您希望在调用 w_vec
时移动向量参数 w_vec
,那么您可以让函数采用 process_copy()
by value 而不是move在调用函数的时候构造这个参数:
std::vector<int>
通过在调用此 void process_copy(std::vector<int> aVec) // <-- not a reference
{
aVec.push_back(42);
}
时用 std::move()
标记向量参数,参数 process_copy()
将被移动构造 - 因此向量参数将最终处于移动状态。