Im „Universum der Bewegungsoperationen“ gibt es vier Möglichkeiten:
target source
is is left
----------------------------------------------------------
constructed <-- constructed // C++11 -- move construction
constructed <-- destructed
assigned <-- constructed // C++11 -- move assignment
assigned <-- destructed
Jede dieser Operationen ist nützlich! std::vector<T>::insert
allein könnte die ersten drei nutzen. Hinweis:
- Die Quelle der 2. und 4. sollte nicht automatische, statische oder Thread-Speicherdauer haben. Die Speicherdauer der Quelle muss dynamisch sein, andernfalls ruft der Compiler den Destruktor für das bereits zerstörte Objekt auf. Und nein, kann der Compiler nicht (im Allgemeinen) Spur, wenn ein Objekt bewegt wurde-von:
X x1, x2;
if (sometimes)
{
x1 = std::move(x2);
}
// Is x2 moved-from here?
Die 2. und 4. können durch die ersten emuliert werden und 3. durch einfaches manuelles Aufrufen des Destruktors auf der Quelle nach der Operation.
Die 1. und 3. sind entscheidend. Algorithmen wie std::swap
und std::sort
benötigen regelmäßig beide Operationen. Diese Algorithmen müssen keine ihrer Eingabeobjekte zerstören — ändern nur ihre Werte.
Bewaffnet mit diesem Wissen in 2001-2002 Zeitrahmen konzentrierte ich meine Bemühungen auf den beiden Operationen, die ihre Quelle die größten (positiven) Auswirkungen auf die damals + C hätten, weil diese beiden Operationen konstruierten links +98. Ich wusste damals, dass, wenn ich die Ambitionen dieses Projekts nicht einschränken würde, es niemals gelingen würde. Selbst beschnitten, war es zu ehrgeizig, um erfolgreich zu sein.
Diese Einschränkung wird in unter dem Abschnitt mit dem Titel "Destructive Move Semantics" bestätigt.
Am Ende haben wir einfach auf diese als zu viel Schmerz für nicht genügend Gewinn aufgegeben. Der aktuelle Vorschlag verbietet jedoch nicht die destruktive Bewegungssemantik in der Zukunft. Es könnte in Ergänzung zu der nicht-destruktiven Bewegung Semantik in diesem Vorschlag getan werden, sollte jemand diese Fackel tragen möchten.
Für weitere Informationen darüber, was man mit einem eingefahrenen von Objekt tun kann, finden Sie https://stackoverflow.com/a/7028318/576911
„Ist das nicht das einzige, was Sie tun können, mit einem fahrener von Objekt ist es sowieso zerstören?“ Stilistisch, ja. Technisch gesehen, können Sie ein anderes Objekt hineinziehen. – edmz