每次复制实现移动分配的非 const 对象时,我是否总是获得移动语义

Do I always get move semantics every time I copy a non const object that implements a move assignment?

本文关键字:移动 是否 语义 对象 实现 复制 分配 const      更新时间:2023-10-16

例如:

std::vector<std::pair<std::string, bool > > v;
std::pair<std::string, bool> pr;
v.push_back( pr );

假设std::pair已定义移动分配运算符。调用v.push_back是否会自动使用移动作业还是我需要像这样特别要求?

v.push_back( std::move(pr) );

只有当函数的参数(在本例中为 push_back 的参数)是右值时,以及在某些情况下从函数返回对象时,您才会得到移动。

在您的示例中,pr不是右值,因此您不会移动它。

但是,例如,如果您将临时对象传递给向量,如下所示:

v.push_back(std::pair<std::string,bool>());

这将是一个右值并触发移动。

您还可以通过按照建议的方式将参数显式转换为右值来触发移动:

v.push_back(std::move(pr));

但是请注意,在这种情况下,您将无法再以有意义的方式在调用后使用pr,因为它的内容已被移走。

(当然,移动的另一个先决条件是你调用的函数实际上接受右值引用。对于矢量push_back情况确实如此。