Je me demande si j'ai compris Ainsi, je me demande vraiment si j'ai bien compris ou est-ce un Erreur de mise en œuvre dans mon g ++ - 4.7.0? P> P> emplace_back code> correctement
emplace_back code> incorrectement: je le cas serait empêcher em> de faire une copie de
héros code>, car il crée l'élément in-place em>. p>
3 Réponses :
euh ... je l'ai eu.
Si je préfère copier fort> le et tous les exemples héros code> s, je dois leur permettre de "fort> bouger strong> , si je veux les mettre dans des conteneurs. Comment idiot de moi. P>
Notez que emplace_back code> fait pas i> nécessite que le type soit mobile - il construit l'élément en place comme vous le pensiez. Toutefois,
std :: vecteur code> en général i> nécessite que son type d'élément soit mobile ou copible, sinon il ne pouvait pas augmenter au besoin.
Ce n'est pas une erreur de mise en œuvre: vous n'avez pas fourni de constructeur de déplacement. P>
Tu étais vite! Je saisis juste ma propre réponse ;-)
Vous devez définir un constructeur de déplacement et un opérateur d'affectation de déplacement, comme celui-ci:
struct Hero { Hero(const string&) {} Hero(const char*) {} Hero(int) {} Hero(Hero&&) {} Hero& operator=(Hero&&) { return *this; } // forbid a clone: Hero(const Hero&) = delete; Hero& operator=(const Hero&) = delete; };
Il convient également de noter que ceux-ci seront générés pour vous si elles manquaient, c'est pourquoi le code compilait et a couru
Ceci est absurde. Si vous avez besoin d'un constructeur de déplacement, l'OMPPACE N'EST PAS VRAIMENT FOND DONNER LE CONSTRUCTOR INPLACER B> TOUT Arguments VARIADIC, vous faites toujours une copie déplacée. Cela ferait de l'empaper_back totalement inutile
@Lurscher à utiliser dans un std :: vecteur code> du tout, les objets doivent être copieux ou mobiles.
Ce n'est plus c ++ 0x. C'est juste C ++ maintenant!
:) code>