2016-08-06 29 views
7

Vor C++ 11, es war schon immer der Fall, dass Zuweisungsoperator kopiert werden immer durch konstante Referenz, wie so passieren sollte:Soll der Zuweisungsoperator durch const Referenz oder nach Wert kopiert werden?

template <typename T> 
ArrayStack<T>& operator= (const ArrayStack& other); 

jedoch mit der Einführung der Umzug Zuordnung Betreiber und Konstrukteure, wie es scheint dass einige Leute dafür plädieren, stattdessen einen Wert für die Kopierzuweisung zu verwenden. Ein Umzug Zuweisungsoperator muss auch hinzugefügt werden:

template <typename T> 
ArrayStack<T>& operator= (ArrayStack other); 
ArrayStack<T>& operator= (ArrayStack&& other); 

Die über 2 Betreiber Umsetzung wie folgt aussieht:

template <typename T> 
ArrayStack<T>& ArrayStack<T>::operator =(ArrayStack other) 
{ 
    ArrayStack tmp(other); 
    swap(*this, tmp); 
    return *this; 
} 

template <typename T> 
ArrayStack<T>& ArrayStack<T>::operator =(ArrayStack&& other) 
{ 
    swap(*this, other); 
    return *this; 
} 

Ist es eine gute Idee Pass von Wert zu verwenden, wenn Kopierzuweisungsoperator für C Erstellung Ab 11 Uhr? Unter welchen Umständen sollte ich dies tun?

+4

'operator = (ArrayStack)' hat keinen Grund, eine Kopie 'tmp' zu erstellen. – aschepler

+3

http://www.slideshare.net/riplelabs/howard-hinnant-accu2014 Folien 43-53 –

+0

Die Pass-by-Value-Version kann die Zuordnung sowohl verschieben als auch kopieren, in der Regel durch Kopieren und Tauschen. –

Antwort

11

Vor C++ 11, es war schon immer der Fall, dass Zuweisungsoperator kopiert werden immer durch konstante Referenz

Das ist nicht wahr passieren sollte. Der beste Ansatz war immer, the copy-and-swap idiom zu verwenden, und das ist, was Sie hier sehen (obwohl die Implementierung im Körper suboptimal ist).

Wenn überhaupt, ist dies weniger nützlich in C++ 11 jetzt, dass Sie auch einen Umzug Zuweisungsoperator haben.

+0

Also ich denke, nichts hat sich geändert, und es ist immer noch Standard, sowohl den Kopierzuweisungsoperator durch const als auch den Zuweisungsoperator rechts zu liefern? – Mantracker

+0

@Mantracker: Sie sollten die verknüpfte Antwort lesen. In der Tat sollten Sie diese Antwort auch lesen, basierend auf Ihrer Aussage _ "es ist immer noch Standard, sowohl den Kopierzuweisungsoperator durch const Referenz" _ zur Verfügung zu stellen, der im direkten Widerspruch zu dem steht, was ich gesagt habe. –

+3

BTW nette Pinguine –