Können sagen, wir die folgende Klasse:Sollte der rvalue nach einem Zug gültig sein?
class Foo
{
public:
Foo() { _bar=new Bar };
Foo(const Foo &right) { _bar=new Bar(right.bar); };
Foo(Foo &&right) { _bar=right._bar; right.bar=new Bar(); };
~Foo() { delete _bar; }
Foo &operator=(const Foo &right) { _bar->opertor=(right.bar); return *this;}
Foo &operator=(Foo &&right) { std::swap(_bar, right._bar); return *this;}
void func() { _bar->test=1 };
private:
Bar *_bar;
};
ist es legitim, an folgenden zu ändern und die Endbenutzer zu erwarten zu wissen, dass nach dem Umzug, dass der R-Wert ist nicht mehr gültig durchgeführt wird (in dieser Berufung alles andere als der Zuweisungsoperator konnte abstürzen)?
mein Anliegen kommt von der Tatsache, dass func (und alle anderen Funktionen in der Klasse) davon ausgehen, dass _bar existiert.
Fehler behoben und Null-Checks zum Operator = – Krazer
Die Bearbeitung ändert im Wesentlichen die Frage. Zuvor würde es einen Null-Zeiger dereferenzieren, wenn sie 'operator =' nach dem Verschieben verwenden würden; wir dachten, du fragst, ob der Umzug in Ordnung ist und der Anrufcode sollte es wissen, um das zu vermeiden. Aber jetzt ist das Objekt nach der Bewegung gültig und es ist unklar, was Ihre Frage ist (in beiden Fällen ist das Objekt jetzt gültig). Bitte bearbeiten Sie noch einmal, um Ihre Absicht zu verdeutlichen –
Ich habe es vielleicht falsch gefragt, aber für mich ist die Frage die gleiche, mit dem folgenden Code-Schnipsel 'Foo a, b; a = std :: move (b); b.func(); '. die Top-Implementierung wird nicht abstürzen, Verhalten ist wahrscheinlich unerwünscht, aber es wird nicht abstürzen. Unter der neuen Implementierung ruft b.func() nach dem Verschieben einen Absturz auf.Die Frage ist dann legitim zu erwarten, dass der Benutzer wissen sollte, dass der Aufruf von etwas anderem als operator = auf b, nach dem Umzug, zum Absturz bringen könnte? – Krazer