2009-06-26 5 views
4

Pour une raison quelconque, le code suivant appelle jamais Event::Event(Event&& e)Pourquoi ce code C++ 0x n'appelle-t-il pas le constructeur de déplacement?

Event a; 
Event b; 
Event temp; 
temp = move(a); 
a = move(b); 
b = move(temp); 

pourquoi pas?

L'utilisation de std::swap l'appelle une seule fois.

class Event { 
public: 
    Event(): myTime(0.0), myNode(NULL) {} 
    Event(fpreal t, Node* n); 
    Event(Event&& other); 
    Event(Event const& other) = delete; 
    ~Event(); 

    bool    operator<(Event const& other) const { return myTime < other.myTime; } 
    bool    operator>(Event const& other) const { return myTime > other.myTime; } 
    fpreal    getTime() const { return myTime; } 
    void    setTime(fpreal time) { myTime = time; } 
    Node*    getNode() const { return myNode; } 

private: 
    fpreal    myTime; 
    Node*    myNode; 
}; 

Répondre

10

Votre code a deux emplacements potentiels pour où l'on peut attendre le constructeur de mouvement pour obtenir appelé (mais il n'a pas):

1) appelant std :: move
2) au cours affectation.

En ce qui concerne 1), std :: move fait simple cast - il ne crée pas un objet à partir d'une copie - si elle a fait alors le constructeur de mouvement pourrait s'invoqué par elle, mais comme il fait un casting simple rvalue il n'est pas invoqué. La définition de std :: move est similaire à static_cast<Event&&>(temp). En ce qui concerne 2), l'initialisation et l'affectation sont deux opérations entièrement différentes (même si certaines formes d'initialisation utilisent le symbole '='). Votre code est affecté et utilise donc l'opérateur d'affectation par défaut qui est déclaré accepter une référence constlvalue. Puisque vous n'initialisez jamais un objet événement avec un autre, vous ne verrez pas votre constructeur de mouvement être appelé. Si vous avez déclaré un opérateur d'affectation de mouvement: Event& operator=(Event&& other), alors votre code actuel l'invoquera ou si vous avez écrit: Event a; Event tmp = move(a); votre constructeur de déplacement, tel qu'il est écrit, sera appelé.

+0

Merci! (marqué comme réponse parce que le vôtre était le premier) –

11

Vous n'utilisez pas le constructeur de déplacement. Je pense que swap est mis en œuvre quelque chose comme ça

Event a; 
Event b; 

Event temp(move(a)); // this one wants to use a move constructor 
a = move(b); 
b = move(temp); 

Vous voulez utiliser l'opérateur d'affectation de déplacement, qui n'existe pas dans votre code, il revient à l'opérateur d'affectation de copie.

Questions connexes