Vedere this SO articolo su emplace_back vs. push_back. Essenzialmente, consente di costruire un oggetto dagli argomenti passati senza dover creare prima l'oggetto da passare. Salva l'overhead rimuovendo una costruzione di copia che normalmente avviene come risultato della creazione di oggetti da inserire.
Così si può ottenere via con questo:
unordered_map<int,int> foo;
foo.emplace(4, 5);
invece di
foo.insert(std::make_pair(4, 5));
Ancora meglio, (e se non mi sbaglio), si può passare attraverso questo percorso:
struct Bar{
int x,y;
Bar(int _x, int _y) : x(_x), y(_y){}
};
unordered_map<int,Bar> baz;
baz.emplace(4, 5, 6);
E preso dal Wiki su C++0x:
A causa della natura della dicitura dei riferimenti rvalue e di alcune modifiche alla dicitura per i riferimenti lvalue (riferimenti regolari), i riferimenti rvalue consentono agli sviluppatori di fornire un perfetto inoltro delle funzioni. Quando combinato con modelli variadici, questa abilità consente modelli di funzioni che possono inoltrare perfettamente argomenti a un'altra funzione che accetta quegli argomenti particolari. Questo è molto utile per inoltrare i parametri del costruttore, per creare funzioni di fabbrica che chiameranno automaticamente il costruttore corretto per quegli argomenti particolari.
che funziona in questo modo:
template<typename TypeToConstruct> struct SharedPtrAllocator {
template<typename ...Args> std::shared_ptr<TypeToConstruct> construct_with_shared_ptr(Args&&... params) {
return std::shared_ptr<TypeToConstruct>(new TypeToConstruct(std::forward<Args>(params)...));
}
}
Anche in questo caso, spudoratamente rubato da questo articolo Wiki di cui sopra.
Quest'ultimo esempio sembra strano per me. Supponiamo di avere 2 costruttori per 'Key':' Key (int) 'e' Key (int, int) 'e 2 per' Value': 'Valore (int, int)' e 'Valore (int)', come è il compilatore di andare a disambuiguate nel caso di costruzione di una coppia di 'chiave/Value'? –
primo arrivato, primo servito prendo? Quindi crea prima un 'X (int, int)' poi un 'X (int)'. Lo testerà più tardi e pubblicherà di nuovo. Potrebbe anche non compilare e lanciare un errore di tempo di compilazione "ambiguo". – Xeo
@Matthieu M. Non ne ho idea, davvero. Il problema è che la specifica non è attualmente pienamente formalizzato e quindi non possiamo sapere con certezza come si suppone che questo tipo di domanda a cui rispondere fino a quando non è. Ciò di cui abbiamo bisogno è un avvocato linguistico per venire a chiarire qualsiasi ambiguità abbia la mia risposta. Lo voterei in un batter d'occhio. – wheaties