10
votes

C ++ 0x Emplace_back avec des articles non copieux

Je me demande si j'ai compris emplace_back correctement xxx

Ainsi, je me demande vraiment si j'ai bien compris emplace_back incorrectement: je le cas serait empêcher de faire une copie de héros , car il crée l'élément in-place .

ou est-ce un Erreur de mise en œuvre dans mon g ++ - 4.7.0?


1 commentaires

Ce n'est plus c ++ 0x. C'est juste C ++ maintenant! :)


3 Réponses :


3
votes

euh ... je l'ai eu.

Si je préfère copier le héros s, je dois leur permettre de "fort> bouger , si je veux les mettre dans des conteneurs. Comment idiot de moi. xxx

et tous les exemples sauf pour la liste d'initialisateur travail.


1 commentaires

Notez que emplace_back fait pas nécessite que le type soit mobile - il construit l'élément en place comme vous le pensiez. Toutefois, std :: vecteur en général nécessite que son type d'élément soit mobile ou copible, sinon il ne pouvait pas augmenter au besoin.



4
votes

Ce n'est pas une erreur de mise en œuvre: vous n'avez pas fourni de constructeur de déplacement.


1 commentaires

Tu étais vite! Je saisis juste ma propre réponse ;-)



6
votes

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;
};


3 commentaires

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 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 du tout, les objets doivent être copieux ou mobiles.