Pregunta

Por alguna razón, el siguiente código nunca llama a Event::Event(Event&& e)

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

¿por qué no?

Usar std::swap lo llama una vez.

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;
};
¿Fue útil?

Solución

Su código tiene dos ubicaciones potenciales para donde uno puede esperar que se llame al constructor de movimientos (pero no es así):

  

1) llamando a std :: move
    2) durante la asignación.

Con respecto a 1), std :: move realiza una conversión simple (no crea un objeto a partir de una copia), si lo hizo, entonces el constructor de movimientos podría ser invocado por él, pero dado que realiza una conversión de valor simple, no lo hace No te invoquen. La definición de std :: move es similar a static_cast<Event&&>(temp).

Con respecto a 2), la inicialización y la asignación son dos operaciones completamente diferentes (aunque algunas formas de inicialización usan el símbolo '='). Su código realiza la asignación y, por lo tanto, utiliza el operador de asignación predeterminado que se declara que acepta una referencia de valor constante. Como nunca inicializa un objeto de evento con otro, no verá cómo se invoca su constructor de movimientos. Si declaró un operador de asignación de movimiento: Event& operator=(Event&& other), entonces su código actual lo invocaría o si escribiera: Event a; Event tmp = move(a); su constructor de movimiento, como está escrito, sería invocado.

Otros consejos

No estás utilizando el constructor move. Creo que swap se implementa de manera similar a esto

Event a;
Event b;

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

Desea utilizar el operador de asignación de movimiento, que no existe en su código, por lo que recurre al operador de asignación de copia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top