例如:
std::vector<std::pair<std::string, bool > > v;
std::pair<std::string, bool> pr;
v.push_back( pr );
假设 std::pair
定义了一个移动赋值运算符。对 v.push_back 的调用会自动使用
移 Action 业还是我需要像这样特别要求?
v.push_back( std::move(pr) );
最佳答案
只有当函数的参数(在本例中为 push_back
的参数)是右值时,以及在某些情况下从函数返回对象时,您才会移动。
在您的示例中,pr
不是右值,因此您不会移动它。
但是,如果您 - 例如 - 将临时对象传递给 vector ,如下所示:
v.push_back(std::pair<std::string,bool>());
这将是一个右值并触发移动。
您还可以通过按照您建议的方式将参数显式转换为右值来触发移动:
v.push_back(std::move(pr));
但是请注意,在这种情况下,您将无法在调用后以有意义的方式使用 pr
,因为它的内容已被移走。
(当然,移动的另一个前提条件是您调用的函数实际上接受右值引用。对于 vector push_back
确实是这种情况。)
关于c++ - 每次复制实现移动赋值的非 const 对象时,我是否总是获得移动语义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13409832/