C++ 移动前复制的保证

C++ 移动前复制的保证,c++,move,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); 是否可以保证在

对于给定的示例代码:

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);

是否可以保证在将某个结构移动到hashmap中之前,会获得某个结构键作为hashmap的键?

表达式可以重写为:

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

因此,第一个调用将是运算符[],而than运算符=

表达式可以重写为:

hashmap.operator[](some_struct.key).operator=(std::move(some_struct));
因此,第一个呼叫将是接线员[],而不是接线员=

是否可以保证获得某个_struct.key作为hashmap的密钥 在移动某些结构之前

移动实际上并不移动。它更像是从左值引用到右值引用的转换。实际移动(如果在赋值过程中有任何1发生),在赋值运算符的左侧求值后按顺序排列

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

是否可以保证获得某个_struct.key作为hashmap的密钥 在移动某些结构之前

移动实际上并不移动。它更像是从左值引用到右值引用的转换。实际移动(如果在赋值过程中有任何1发生),在赋值运算符的左侧求值后按顺序排列


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

此答案没有考虑此代码的两个重要细微差别,即这些函数调用的求值是按顺序进行的,并不是std::move进行移动,否则您可能会遇到问题。因此,这并不是问题的真正答案。这个答案没有考虑到这段代码的两个重要细微差别,即这些函数调用的求值是按顺序进行的,而不是std::move进行移动,否则可能会有问题。因此,这并不是问题的真正答案。