Erstellen von nicht kopierbaren, aber beweglichen Objekten in C ++

8

Nur eine Frage. Mit Blick auf C ++ Boost-Bibliotheken (insbesondere Boost :: Thread-Klasse) dachte ich: "Wie ist es möglich, eine Klasse zu erstellen, die Objekte definiert, die nicht kopiert werden können, aber von einer Funktion zurückgegeben werden?"

Nun, beachte dieses Beispiel, die boost :: thread-Klasse hat die oben erwähnten Eigenschaften, also ist es möglich:

%Vor%

Nun, das bedeutet, dass das Objekt boost :: thread nicht kopiert werden kann, aber von einer Funktion zurückgegeben wird, ist dies möglich. Wie ist das möglich ????

Ich nehme an, dass ein Kopierkonstruktor nicht zur Verfügung gestellt werden muss, sondern wie man mit der Rückkehr von einer Funktion umgehen kann? Braucht es keinen Kopierkonstruktor?

Danke

    
Andry 23.11.2010, 19:50
quelle

2 Antworten

4

Dies wird in C ++ 1x möglich sein, das eine Bewegungssemantik über R-Wert-Referenzen bereitstellt. Mit diesem können Sie separat verschieben und / oder kopieren:

%Vor%

Kopieren und Verschieben können separat verboten werden. Sie können also Klassen erstellen, die verschoben, aber nicht kopiert werden können.

Natürlich gibt es ein paar magische Tricks, mit denen Sie dies auch dann tun können, wenn Ihr Compiler noch keine Verschiebe-Semantik unterstützt ( std::auto_ptr , nach allen Verschiebungen anstatt zu kopieren, wenn zugewiesen), also könnte dies für% funktionieren. co_de% sogar in Abwesenheit von Bewegungssemantik.

    
sbi 23.11.2010 19:53
quelle
2

Dies ist ein fortgeschrittenes Thema von C ++, wenn Sie dies in C ++ 03 tun möchten. Ein Beispiel dafür finden Sie Howard Hinnants Unique_ptr C ++ 03 Emulation .

Es funktioniert im Grunde, indem es einige subtile Regeln in der C ++ - Überladungsauflösung missbraucht, insbesondere die Regel, dass nicht-konstante Referenzen nicht an rvalue-Provisorien binden können und dass nicht-const-Konvertierungsfunktionen immer noch für nicht-konstante Provisorien aufgerufen werden können.

Sie können auch die auto_ptr-Methode von C ++ 03 verwenden, die jedoch von mehreren Gruppen als defekt angesehen wird, da auto_ptr Sie Variablen kopieren, aber Ressourcen aus dem kopierten Objekt stehlen können (andere Gruppen haben andere Meinungen darüber dies).

    
Johannes Schaub - litb 23.11.2010 19:54
quelle