2015-10-31 7 views
23

In C++ 11 wurde "move semantics" eingeführt, implementiert über die zwei speziellen Member: move constructor und move assignment. Beide dieser Operationen lassen das bewegte Objekt von konstruieren.Warum lässt die C++ - Semantik die Quelle konstruieren?

Wäre es nicht besser gewesen, die Quelle in einem zerstörten Zustand zu belassen? Ist nicht das Einzige, was Sie mit einem bewegten Objekt tun können, es trotzdem zu zerstören?

+1

„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

Antwort

25

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

+0

Wow, ich habe nicht gemerkt, dass move semantics bereits in den Jahren '01 ... – Mehrdad

+0

Es gibt einen C++ 1z-Vorschlag für eine destruktive Bewegung, die für Notlaufprobleme motiviert ist. – Yakk