对于给定的示例代码:
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
的关键?
答案 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=