Frage

Aus irgendeinem Grund, der folgende Code nie nennt Event::Event(Event&& e)

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

Warum nicht?

Mit std::swap nennt es einmal.

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;
};
War es hilfreich?

Lösung

Ihr Code hat zwei mögliche Standorte für, wo man den Umzug Konstruktor erwarten kann genannt werden (aber es funktioniert nicht):

  

1) Aufruf std :: bewegen
    2) bei der Zuordnung.

In Bezug auf 1), std :: bewegt sich eine einfache Guss - es schafft nicht ein Objekt aus einer Kopie - wenn es so wäre, dann könnte der Umzug Konstruktor durch sie aufgerufen, aber da es sich um eine einfache rvalue tut werfen es doesn‘ t aufgerufen erhalten. Die Definition von std :: Bewegung ist ähnlich static_cast<Event&&>(temp).

In Bezug auf 2), Initialisierung und Zuordnung sind zwei völlig verschiedene Operationen (auch wenn einige Formen der Initialisierung verwenden, um das ‚=‘ Symbol). Ihr Code tut Zuordnung und daher verwendet den Standardzuweisungsoperator, der erklärt wird, einen const lvalue Bezug zu akzeptieren. Da Sie nie mit einem anderen Event-Objekt zu initialisieren, werden Sie sehen, Ihr Umzug Konstruktor nicht aufgerufen erhalten. Wenn Sie einen Zug Zuweisungsoperator erklärt: Event& operator=(Event&& other), dann Ihr aktueller Code auf ihn berufen würde oder wenn Sie schreibt:. Event a; Event tmp = move(a); Ihren Umzug Konstruktor, wie geschrieben, würde aufgerufen erhalten

Andere Tipps

Sie werden den Umzug Konstruktor nicht verwenden. Ich denke, Swap so etwas wie dies umgesetzt wird,

Event a;
Event b;

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

Sie mögen den Umzug Zuweisungsoperator verwenden, die nicht in Ihrem Code nicht vorhanden ist, so fällt es zurück auf den Kopierzuweisungsoperator.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top