【发布时间】:2021-04-22 02:43:00
【问题描述】:
我尝试理解移动语义的概念并做了一些测试。我有以下功能:
// 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);
}
现在在 main 函数中,如下:
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是可移动的对象吗?
【问题讨论】:
-
std::move()只是强制转换。你必须将结果传递给将要移动的东西,如果你想被移动,而不仅仅是演员......让我找到许多重复项之一。 -
"要修改的参数而不复制" - 所以只需传递一个普通的引用
& vec,而不是一个右值引用&& vec。然后您不必使用std::move()来转换为右值引用。移动语义似乎并不意味着您认为它们的意思,并且单独的std::move()永远不会移动,只需转换为右值 ref 以便接收器可能从相同移动。 -
正如你的标题所说,它是语义。没有调用执行移动的代码,因此没有发生移动。
标签: c++ c++11 move move-semantics