c++ - 每次复制实现移动赋值的非 const 对象时,我是否总是获得移动语义?

标签 c++

例如:

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/

相关文章:

c++ - 用 boost spirit 解析一对整数

c++ - 使用 "this"的成员函数的返回值

c++ - 使我的结构或类与 std::round 兼容

c++ - 类型界面略有不同时模板的正确使用

c++ - 测量 OpenCL 应用程序的运行时间

c++ - 如果该类不是 `copy constructor`,是否可以移动对象?

c++ - 编译 C++ 时 undefined reference

c++ - 为什么编译器会生成这个程序集?

c++ - 使用 u_context 结构 - uc_stack.ss_flags 的用途是什么?

c++ - 使用 C++ 在 Linux 中使用系留相机应用程序