Insérer dans le vecteur d'avoir des objets sans constructeur de copie

J'ai une classe dont la copie constructeurs sont explicitement supprimé (car Un utilise des pointeurs en interne et je ne veux pas tomber dans la copie superficielle pièges):

class A {
  public:
    A(const A&) = delete;
    A& operator=(const A&) = delete;

    A(const B& b, const C& c);
}

Maintenant, j'ai un vecteur de type vector<A> aVector; et je veux insérer des éléments dans il - donc j'utilise emplace_back:

aVector.emplace_back(b, c);

Toutefois, cela ne parvient pas à le compiler avec gcc et j'obtiens l'erreur -

third-party/gcc-4.7.1-glibc-2.14.1/libgcc/libgcc-4.7.1/afc21dc/include/c++/4.7.1/bits/stl_construct.h: In instantiation of 'void std::_Construct(_T1*, _Args&& ...)
third-party/gcc-4.7.1-glibc-2.14.1/libgcc/libgcc-4.7.1/afc21dc/include/c++/4.7.1/bits/stl_uninitialized.h:77:3:   required from 'static _ForwardIterator std::__uninitialized_copy<_TrivialValueTypes>::__uninit_copy(_InputIterator, _InputIterator, _ForwardIterator)  
third-party/gcc-4.7.1-glibc-2.14.1/libgcc/libgcc-4.7.1/afc21dc/include/c++/4.7.1/bits/stl_uninitialized.h:119:41:   required from '_ForwardIterator std::uninitialized_copy(_InputIterator, _InputIterator, _ForwardIterator) 
third-party/gcc-4.7.1-glibc-2.14.1/libgcc/libgcc-4.7.1/afc21dc/include/c++/4.7.1/bits/stl_uninitialized.h:260:63:   required from '_ForwardIterator std::__uninitialized_copy_a(_InputIterator, _InputIterator, _ForwardIterator, std::allocator<_Tp>&) 
third-party/gcc-4.7.1-glibc-2.14.1/libgcc/libgcc-4.7.1/afc21dc/include/c++/4.7.1/bits/stl_uninitialized.h:283:67:   required from '_ForwardIterator std::__uninitialized_move_if_noexcept_a(_InputIterator, _InputIterator, _ForwardIterator, _Allocator&)
third-party/gcc-4.7.1-glibc-2.14.1/libgcc/libgcc-4.7.1/afc21dc/include/c++/4.7.1/bits/vector.tcc:410:6:   required from 'void std::vector<_Tp, _Alloc>::_M_emplace_back_aux(_Args&& ...) 
third-party/gcc-4.7.1-glibc-2.14.1/libgcc/libgcc-4.7.1/afc21dc/include/c++/4.7.1/bits/vector.tcc:102:4:   required from 'void std::vector<_Tp, _Alloc>::emplace_back(_Args&& ...)

Quelle est la raison de cette erreur et comment peut-il être résolu sans la suppression la suppression de la copie des constructeurs? Ai-je besoin d'un constructeur de déplacement - t-il besoin d'être explicitement définis?

Comment définissez-vous A(const B& b, const C& c); ?
J'ai touché à cette même question de moi-même, et pour moi c'était à cause de copier-élision de l'épanouissement. Le copier-ctor doit être fournie, mais n'a jamais été appelé. Je viens de tester votre mise en page, et l'expérience de la même question de montrer ici à l'aide de clang-500.2.79 sur mon Mac. Fournir une copie-ctor autorisé à compiler, mais jamais appelé à la mise en œuvre de copier-ctor. De même avec la fourniture d'un déménagement-ctor. Je dois dépoussiérer l'historique de la question pour trouver la question connexe. Une fois que vous avez touché un point d'extension dans le vecteur, déplacez-la construction sera invoquée si elle est disponible, de sorte que vous meilleur add-on, peu importe.
Vous devez ajouter constructeur de déplacement - parce que emplace_back de vector peut faire réinstallation qui nécessite de copier/déplacer constructeur. Ou simplement l'utiliser std::deque.

OriginalL'auteur vigs1990 | 2013-11-07