Warum nicht diese C ++ 0x-Code aufrufen den Umzug Konstruktor?
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;
};
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.