每次复制实现移动分配的非 const 对象时,我是否总是获得移动语义
Do I always get move semantics every time I copy a non const object that implements a move assignment?
例如:
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
情况确实如此。
相关文章:
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 移动后是否需要重置标准::列表?
- 是否可以在C++中移动临时对象的属性?
- C++ 移动语义是否在任何情况下都能节省资源?
- 如果这不是类的"复制构造函数",是否可以移动对象?
- vector是否为std::移动的对象连续分配内存
- 是否可以避免在以下代码中复制/移动构造函数的需要?
- 移动构造函数是否C++过时?
- 如何获取类型是否真正可移动可构造
- 使用 std::move 将参数传递给函数,如果该参数声明为按值传递或使用移动操作数 &&,是否有区别?
- 是否允许将列移动到索引 0?
- 是否可以通过使用移动/交换 c++11 来延长返回的临时变量的生命周期
- 移动 std::bitset<N> 是否超过 N 个位置未定义的行为?
- 我是否缺少<实验/文件系统>移动操作?
- 是否可以将移动的变量标记为不再可用,并在使用它时收到编译器警告?
- 返回 *&object 时是否允许复制/移动省略?
- 如果没有带有函数签名的 rvalue 参数,是否会执行 C++ 11 中的移动语义?
- 是否有可能具有放入容器的移动操作的类型?
- 移动是否分配了 std::fstream 关闭原始流
- 移动是否使对象处于可用状态