C++ 传递给函数时使用std::vector错误移动语义

C++ 传递给函数时使用std::vector错误移动语义,c++,c++11,move,move-semantics,C++,C++11,Move,Move Semantics,我试图理解移动语义的概念,并做了一些测试。我有以下功能: // 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)

我试图理解移动语义的概念,并做了一些测试。我有以下功能:

// 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);
}
void process_copy(std::vector<int> aVec) // <-- not a reference
{
    aVec.push_back(42);
}
//传递时测试移动语义
//要修改而不复制的参数
作废流程副本(标准::矢量和aVec)
{

std::cout您可能缺少的是,您只是将右值引用绑定到您传递的向量;您根本没有移动向量对象

process\u copy()
参数的类型为
std::vector&
,即对
std::vetor
的右值引用:

您只是可以将此引用(即,
process\u copy()
的参数,
aVec
)绑定到参数(即向量
w\u vec
)上。也就是说,以下内容不会编译:

process_copy(w_vec);
因为不能将右值引用(
aVec
)绑定到左值(
w_-vec


如果您希望在调用
process\u copy()
时移动向量参数
w_vec
,则可以使用函数按值获取
std::vector
,并在调用函数时移动并构造此参数:

// 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);
}
void process_copy(std::vector<int> aVec) // <-- not a reference
{
    aVec.push_back(42);
}
void process\u copy(std::vector aVec)//我的t恤衫的图像可能与此相关


std::move()
仅强制转换。如果要从中移动,则必须将结果传递给将从中移动的对象,而不仅仅是强制转换…让我从众多重复项中找到一个。这是否回答了您的问题?“要修改而不复制的参数”-因此,只需传递一个普通引用
&vec
,而不是右值引用
和&vec
。这样您就不必使用
std::move()
强制转换为右值引用。移动语义似乎并不是您认为它们的意思,而且
std::move()
独自一人永远不会移动,只需将其转换为右值引用,以便接收者可以从同一位置移动。正如标题所述,这是语义。没有调用执行移动的代码,因此没有移动。我想可以肯定地说,我从未对自己设计的行为感到惊讶。自我回答是一个问题。@HowardHinnant这是一个笑话。我也在使用occas这是我回答自己问题的技巧。希望这不是一个冒犯性的笑话,如果是的话,我当然可以编辑以重新措辞或删除它。无论如何,你的问题和答案是关于这个主题的一个很好的资源,如果我贴的t恤上的解释还不够的话。不,我一点也不生气。谢谢你的回答!
void process_copy(std::vector<int> aVec) // <-- not a reference
{
    aVec.push_back(42);
}