En plus de ce visiteur dit :
La fonction void emplace_back(Type&& _Val)
fournis par MSCV10 est non conforme et redondantes, car comme vous l'avez remarqué il est strictement équivalent à push_back(Type&& _Val)
.
Mais le vrai C++0x forme d' emplace_back
, c'est vraiment utile: void emplace_back(Args&&...)
;
Au lieu de prendre un value_type
il faut un variadic liste d'arguments, ce qui signifie que vous pouvez maintenant parfaitement en avant l'argument et de construire directement un objet dans un contenant sans que temporaire.
C'est utile, Parce que peu importe combien l'intelligence RVO et déplacer sémantique apporter à la table, il y a encore compliqué les cas où un push_back est susceptible de rendre inutiles les copies (ou déplacer). Par exemple, avec les traditionnels insert()
fonction d'un std::map
, vous devez créer un temporaire, qui sera ensuite copié dans un std::pair<Key, Value>
, qui seront alors copiés dans la carte :
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);
Alors pourquoi n'ont-ils pas mettre en œuvre la bonne version de emplace_back dans MSVC ? En fait, il m'énerve trop il y a longtemps, j'ai donc posé la même question sur le Visual C++ blog. Voici la réponse de Stephan T Lavavej, le mainteneur officiel de l'Visual C++ de la bibliothèque standard de mise en œuvre de Microsoft.
Q : la bêta 2 emplace fonctions juste une sorte d'espace réservé à l'instant ?
R : Comme vous le savez peut-être, variadic templates
ne sont pas mises en œuvre dans VC10. Nous
simuler avec préprocesseur
machines pour des choses comme
make_shared<T>()
, tuple, et le nouveau
les choses en <functional>
. Cette
préprocesseur machines est relativement
difficile à utiliser et à entretenir. Aussi,
il affecte de manière significative la compilation
la vitesse, comme nous l'avons à plusieurs reprises
inclure subheaders. En raison d'un
la combinaison de nos contraintes de temps
et la vitesse de compilation préoccupations, nous
n'ai pas simulé variadic templates
dans notre emplace fonctions.
Lorsque les variadic templates sont
mis en œuvre dans le compilateur, vous pouvez
s'attendre à ce que nous allons profiter de
dans les bibliothèques, y compris dans
notre emplace fonctions. Nous prenons
la conformité très au sérieux, mais
malheureusement, nous ne pouvons pas tout faire
tout à la fois.
C'est une décision compréhensible. Tout le monde qui a essayé juste une fois pour émuler variadic template avec préprocesseur horribles trucs savoir comment dégueulasse ce genre de choses arrive.