Etwas stört mich an:
MyClass& operator=(const MyClass& other)
{
MyClass tmp(other);
swap(tmp);
return *this;
}
Erstens irritiert das Lesen des Wortes "Tauschen", wenn mein Verstand "Kopieren" denkt, meinen gesunden Menschenverstand. Außerdem stelle ich das Ziel dieses ausgefallenen Tricks in Frage. Ja, Ausnahmen beim Erstellen der neuen (kopierten) Ressourcen sollten vor dem Austausch auftreten. Dies scheint ein sicherer Weg zu sein, um sicherzustellen, dass alle neuen Daten gefüllt sind, bevor sie live geschaltet werden.
Das ist gut. Was ist also mit Ausnahmen, die nach dem Tausch auftreten? (Wenn die alten Ressourcen zerstört werden, wenn das temporäre Objekt den Gültigkeitsbereich verlässt.) Aus Sicht des Benutzers der Zuweisung ist die Operation fehlgeschlagen, außer dies war nicht der Fall. Es hat einen großen Nebeneffekt: Die Kopie ist tatsächlich passiert. Es war nur eine Ressourcenbereinigung, die fehlgeschlagen ist. Der Status des Zielobjekts wurde geändert, obwohl der Vorgang von außen fehlgeschlagen zu sein scheint.
Also schlage ich vor, anstelle von "Swap" einen natürlicheren "Transfer" durchzuführen:
MyClass& operator=(const MyClass& other)
{
MyClass tmp(other);
transfer(tmp);
return *this;
}
Es gibt noch die Konstruktion des temporären Objekts, aber die nächste sofortige Aktion besteht darin, alle aktuellen Ressourcen des Ziels freizugeben, bevor die Ressourcen der Quelle dorthin verschoben werden (und NULL, damit sie nicht doppelt freigegeben werden).
Anstelle von {konstruieren, bewegen, zerstören} schlage ich {konstruieren, zerstören, bewegen} vor. Der Zug, der die gefährlichste Aktion ist, ist der letzte, der ausgeführt wird, nachdem alles andere erledigt ist.
Ja, ein Fehlschlag der Zerstörung ist in beiden Schemata ein Problem. Die Daten sind entweder beschädigt (kopiert, wenn Sie nicht dachten, dass dies der Fall ist) oder verloren (freigegeben, wenn Sie nicht glauben, dass dies der Fall ist). Verloren ist besser als korrupt. Keine Daten sind besser als schlechte Daten.
Übertragen statt tauschen. Das ist sowieso mein Vorschlag.