移动前保证复制

时间:2016-12-28 13:05:37

标签: c++ move

对于给定的示例代码:

struct some_struct_t {
    std::string key;
    // other fields;
}

std::unordered_map<std::string, TSomeStruct> hashmap;

some_struct_t some_struct;
// filling some_struct

hashmap[some_struct.key] = std::move(some_struct);

在将some_struct.key移动到hashmap之前,是否可以保证some_struct成为hashmap 的关键?

2 个答案:

答案 0 :(得分:4)

  

是否保证将some_struct.key作为hashmap的关键字   在移动some_struct之前?

std::move()实际上并没有移动。它更像是从左值引用到右值引用的转换。实际移动(如果有任何 1 )在赋值期间发生,在评估赋值运算符的左侧之后进行排序。

1 如果赋值解析为移动赋值或按值接收其参数并使用move-constructor的复制赋值,则会发生移动。

答案 1 :(得分:2)

表达式可以重写为:

hashmap.operator[](some_struct.key).operator=(std::move(some_struct));

所以第一次通话将是operator[]而不是operator=