Oltre a ciò che il visitatore ha detto:
La funzione void emplace_back(Type&& _Val)
fornita da MSCV10 non è conforme e ridondante, perché come hai notato è strettamente equivalente a push_back(Type&& _Val)
.
Ma la vera forma C ++ 0x di emplace_back
è davvero utile void emplace_back(Args&&...)
:;
Invece di prendere un value_type
prende un elenco variadico di argomenti, quindi ciò significa che ora puoi inoltrare perfettamente gli argomenti e costruire direttamente un oggetto in un contenitore senza un temporaneo.
Questo è utile perché non importa quanta intelligenza l'RVO e lo spostamento semantico portano al tavolo ci sono ancora casi complicati in cui è probabile che un push_back faccia copie (o spostamenti) non necessarie. Ad esempio, con la tradizionale insert()
funzione di a std::map
, devi creare un temporaneo, che verrà quindi copiato in a std::pair<Key, Value>
, che verrà quindi copiato nella mappa:
std::map<int, Complicated> m;
int anInt = 4;
double aDouble = 5.0;
std::string aString = "C++";
// cross your finger so that the optimizer is really good
m.insert(std::make_pair(4, Complicated(anInt, aDouble, aString)));
// should be easier for the optimizer
m.emplace(4, anInt, aDouble, aString);
Quindi perché non hanno implementato la versione corretta di emplace_back in MSVC? In realtà, mi ha infastidito troppo tempo fa, quindi ho posto la stessa domanda sul blog di Visual C ++ . Ecco la risposta di Stephan T Lavavej, manutentore ufficiale dell'implementazione della libreria standard Visual C ++ presso Microsoft.
D: Le funzioni di beta 2 emplace sono solo una specie di segnaposto in questo momento?
A: Come forse saprai, i modelli variadic non sono implementati in VC10. Li simuliamo con macchinari preprocessore per cose come
make_shared<T>()
, la tupla e le cose nuove <functional>
. Questo macchinario preprocessore è relativamente difficile da usare e mantenere. Inoltre, influisce in modo significativo sulla velocità di compilazione, poiché dobbiamo includere ripetutamente i sottotitoli. A causa di una combinazione dei nostri vincoli temporali e problemi di velocità della compilazione, non abbiamo simulato modelli variadici nelle nostre funzioni di emplace.
Quando i modelli variadic sono implementati nel compilatore, puoi aspettarti che ne trarremo vantaggio nelle librerie, anche nelle nostre funzioni di emplace. Prendiamo molto sul serio la conformità, ma sfortunatamente non possiamo fare tutto in una volta.
È una decisione comprensibile. Chiunque abbia provato una sola volta a emulare il modello variadico con trucchi orribili del preprocessore sa quanto sia disgustosa questa roba.