Nel mio codice, ho qualcosa di simile:C++ 11: Sta usando std :: move sicuro solo su oggetti temporanei?
unordered_multimap<string, unordered_map<string, string> > mEntities;
...
vector<unordered_map<string, string> > rawEntities;
if (qi::phrase_parse(&buf[0], (&buf[0]) + buf.size(), EntityParser<char*>(), qi::space, rawEntities)) {
for (auto &propGroup : rawEntities) {
auto search = propGroup.find("classname");
if (search != propGroup.end()) {
// is stealing propGroup safe???
mEntities.emplace(search->second, std::move(propGroup));
}
}
}
// rawEntities goes out of scope here
Come potete vedere, sto usando std::move
su un oggetto di tipo dedotto a unordered_map<string, string>&
, che è, ovviamente, non unordered_map<string, string>&&
. Tuttavia, so per certo che poiché rawEntities
esce dallo scope dopo il ciclo for
, i suoi elementi (le string-> string maps) non saranno mai più utilizzati. Quindi sto immaginando che è sicuro rubare (spostare) i suoi dati di elementi perché non saranno più utilizzati.
Quando eseguo il programma, sembra funzionare. Ma questa cattiva pratica/un anti-modello, e in particolare, lo standard garantisce che sia sicuro?
Solo guardando il titolo della domanda, la risposta è che gli oggetti temporanei sono (per definizione) prvalues e 'std :: move' è solo un cast, che in questo caso non è necessario. –