swap
-
hi
das normale swap wird ja normalerweise so implementiert:
template<typename T> void swap(T& lhs, T& rhs) { T temp(lhs); lhs = rhs; rhs = temp; }was sprich denn gegen diese implementierung:
template<typename T> void swap(T& lhs, T& rhs) { T* temp = &lhs; &lhs = &rhs; &rhs = &temp; }
-
Schau's dir doch mal im Debugger durch, dann siehst du womöglich den Unterschied

(die erste Variante speichert einen der zu tauschenden Werte in einer lokalen Variablen, der zweite holt sich nur einen weiteren Zeiger auf eine Variable - d.h. mit der zweiten Zuweisung überschreibst du auch den Inhalt, auf dem temp zeigt)
-
Nein, das geht nicht (Rückgabe des Adress-Ops verändern). Sieh dir das Gimpl-Idom an.
-
lol_of_lolcraft schrieb:
was sprich denn gegen diese implementierung:
template<typename T> void swap(T& lhs, T& rhs) { T* temp = &lhs; &lhs = &rhs; &rhs = &temp; }...dass sie nicht kompiliert.
-
EOutOfResources schrieb:
Nein, das geht nicht (Rückgabe des Adress-Ops verändern). Sieh dir das Gimpl-Idom an.
Gimpl? Ich kenn Pimpl. Wenn du was anderes meinst, würde ich mich sehr über eine Quelle freuen, da ich in Google keine Quelle finde.
Danke EOutOfResources für deine zukünftige Antwort!
-
Der Nette schrieb:
Gimpl?
Oh, vertippt. Ich meinte das Pimpl-Idom.
-
Was hat denn das mit pimpl zu tun.
-
brotbernd schrieb:
Was hat denn das mit pimpl zu tun.
weil du mit pimpl ganz einfach swap ohne kopien implementieren kannst.
-
lol_of_lolcraft schrieb:
was sprich denn gegen diese implementierung:
template<typename T> void swap(T& lhs, T& rhs) { T* temp = &lhs; &lhs = &rhs; &rhs = &temp; }Dass sie nicht funktioniert. Du kannst in C++ die Adressen zweier Variablen nicht vertauschen (selbst Zeiger können das nicht, da kann man nur das, auf das sie zeigen, vertauschen, aber nicht die Adressen der Zeigervariablen selbst).