2016-12-28 2 views
1

Pour exemple de code donné:Garantie de copie avant de

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

est-il une garantie que some_struct.key sera obtenu comme une clé pour hashmapavant déplacer some_struct en hashmap?

Répondre

4

Y a-t-il une garantie que some_struct.key sera obtenu comme une clé pour hashmap avant de some_struct ?

Oui.

std::move() ne bouge pas réellement. Cela ressemble plus à une distribution d'une référence lvalue à une référence rvalue. Le déplacement réel (le cas échéant) se produit pendant l'affectation proprement dite, qui est séquencée après l'évaluation du côté gauche de l'opérateur d'affectation. Le déplacement se produira si l'affectation résout une affectation de mouvement ou une affectation de copie qui reçoit son argument par valeur et utilise le constructeur de mouvement.

2

expression peut être Réécriture comme:

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

donc premier appel sera operator[] et que operator=

+0

Cette réponse ne prend pas en compte les deux nuances importantes de ce code, à savoir que l'évaluation de ces appels de fonction est _sequenced_, et que ce n'est pas le 'std :: move' qui fait le déplacement (sinon vous _ potentiellement avoir un problème). En tant que tel, ce n'est pas vraiment une réponse à la question. –