4

J'essaye d'implémenter un constructeur de déplacement pour l'objet A qui utilise la classe Id. L'identifiant de classe est automatiquement généré et pour le futur codage, j'ai choisi de supprimer le constructeur par défaut quand je le fais.C++ Pourquoi ne puis-je pas utiliser swap sur un objet avec un constructeur par défaut supprimé

Pourtant, lorsque j'essaie d'utiliser swap dans le constructeur de déplacement de A, il se plaint que le constructeur par défaut est supprimé. Je pensais que swap ne construisait pas de nouveaux objets, mais échangeait simplement les adresses des deux objets.

Ai-je mal compris et il est en train de créer une troisième instance temporaire de Id ??

Si tel est le cas, quelle est la meilleure façon de procéder pour implémenter le constructeur de mouvement ci-dessous?

J'ai inclus un exemple minimal ci-dessous:

class Id { 

public: 
    Id() = delete; 
    Id(std::string id) : m_id(id) {} 

private: 
    std::string m_id; 
}; 

class A { 

public: 
    A() = delete; 
    A(Id id) : m_id(id) {} 


    A(A&& other) { 
     std::swap(m_id, other.m_id); 
    } 

private: 
    Id m_id; 
}; 

le compilateur renvoie l'erreur suivante:

In constructor 'A::A(A&&)': 
21:18: error: use of deleted function 'Id::Id()' 
8:5: note: declared here 
In file included from /usr/include/c++/4.9/bits/stl_pair.h:59:0, 
       from /usr/include/c++/4.9/bits/stl_algobase.h:64, 
       from /usr/include/c++/4.9/bits/char_traits.h:39, 
       from /usr/include/c++/4.9/ios:40, 
       from /usr/include/c++/4.9/ostream:38, 
       from /usr/include/c++/4.9/iostream:39, 
       from 2: 
/usr/include/c++/4.9/bits/move.h: In instantiation of 'void std::swap(_Tp&, _Tp&) [with _Tp = A]': 
34:17: required from here 
/usr/include/c++/4.9/bits/move.h:176:11: error: use of deleted function 'A& A::operator=(const A&)' 
     __a = _GLIBCXX_MOVE(__b); 
     ^
15:7: note: 'A& A::operator=(const A&)' is implicitly declared as deleted because 'A' declares a move constructor or move assignment operator 
In file included from /usr/include/c++/4.9/bits/stl_pair.h:59:0, 
       from /usr/include/c++/4.9/bits/stl_algobase.h:64, 
       from /usr/include/c++/4.9/bits/char_traits.h:39, 
       from /usr/include/c++/4.9/ios:40, 
       from /usr/include/c++/4.9/ostream:38, 
       from /usr/include/c++/4.9/iostream:39, 
       from 2: 
/usr/include/c++/4.9/bits/move.h:177:11: error: use of deleted function 'A& A::operator=(const A&)' 
     __b = _GLIBCXX_MOVE(__tmp); 
+0

Comment SWAP faire son travail en une seule étape? –

Répondre

6

Vous pouvez utiliser swap sur les Id objets, le problème est pas là , mais dans le constructeur de A.

A(A&& other) { 
    std::swap(m_id, other.m_id); 
} 

Ceci est un défaut construit Id, et échanger ensuite avec le membre de l'autre A.

Pour éviter le constructeur par défaut, vous devez initialiser le Id dans la liste initialiseur

A(A&& other) : m_id(std::move(other.m_id)) 
{ }