2014-12-21 8 views
7

Ich ging über einige C++ - Quellcode from a library in Bezug auf ein Haustier-Projekt, ich arbeite an und stieß auf etwas, das ich nicht verstehe. An einem Ort, wo ich eine Pointer-Dereference durch Zuweisung gefolgt erwartet, nutzen die Bibliothek Autoren std::swap() nahe dem Ende der Funktion um das Ergebnis zu schreiben:mit std :: swap statt Zuweisung mit '=' Operator

std::swap(*out, result);

ich erwartet habe, so etwas zu sehen:

*out = result;

anzumerken, dass ein resulttypedef von size_t und out ist ein Zeiger auf die gleiche Art.

Wenn es um "Systemprogrammierung" geht, ist mein Hintergrund in C und C#, aber nicht viel in C++. Gibt es einen besonderen Grund für diese Art von "Zuweisung"?

+1

Wenn der Wert 'result' nach dem Swap * nicht * verwendet wird, ist' std :: move' möglicherweise die bessere Wahl. Siehe auch [Was genau ist ein R-Wert in C++?] (Http://stackoverflow.com/q/9406121/608639). – jww

+0

@jww, 'result' wird nach dem Aufruf von' std :: swap' nicht verwendet. – easuter

Antwort

9

Wenn die Werttypen interessanter sind, zum Beispiel ein std::vector<T>, kann es sinnvoller sein std::swap() ein temporär konstruiertes Objekt an Ort und Stelle zu setzen, anstatt es zuzuweisen: vorausgesetzt, das temporäre Ergebnis geht gerade weg eine Zuweisung und nur Zeiger ändern ist sinnvoll. Ich sehe keinen Grund, so etwas mit grundlegenden Typen wie std::size_t zu tun.

+0

Ok, danke für die Antwort! – easuter

+3

** + 1 ** für die knappe Antwort. Oder, in C++ 11, kann move-Semantik verwenden, um die Zuweisung loszuwerden. Ich würde darauf hinweisen, dass die 'swap'-Konstruktion häufig im Copy-and-Swap-Idiom http://stackoverflow.com/q/3279543/3093378 zu sehen ist, wenn Sie sicherstellen möchten, dass Sie Objekte in undefined nicht verlassen gibt an, wenn Sie sie aufgrund von Ausnahmewürfen kopieren. – vsoftco