2016-08-06 12 views
7

Przed C++ 11, to zawsze był przypadek, że kopiowanie operator przypisania zawsze powinny przechodzić przez const odniesienia, tak jak poniżej:Czy należy kopiować operator przypisania według referencji lub wartości?

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

Jednak wraz z wprowadzeniem operatorów przypisania ruch i konstruktorów, wydaje niektórzy ludzie opowiadają się za tym, by zamiast tego używać wartości przekazywanych według wartości. Operator przypisania ruch musi również zostać dodane:

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

Powyższy 2 realizacja operator wygląda następująco:

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; 
} 

Czy to dobry pomysł, aby wykorzystać podanie o wartości podczas tworzenia kopii operator przypisania dla C++ 11 lat? W jakich okolicznościach powinienem to zrobić?

+4

'operator = (ArrayStack)' nie ma powodu, aby utworzyć kopię 'tmp'. – aschepler

+3

http://www.slideshare.net/ripplelabs/howard-hinnant-accu2014 slajdy 43-53 –

+0

Wersja pass-by-value może wykonywać zarówno przeniesienie, jak i kopiowanie, zwykle przez kopiowanie i zamianę. –

Odpowiedz

11

Przed C++ 11, zawsze było tak, że kopia operator przypisania powinny zawsze przechodzą przez const odniesienia

to nie jest prawdą. Najlepszym podejściem zawsze było użycie the copy-and-swap idiom, i to właśnie widzisz tutaj (chociaż implementacja w ciele jest nieoptymalna).

Jeśli cokolwiek, to jest mniej przydatne w C++ 11 teraz, gdy masz również operatora przypisania ruchu.

+0

Sądzę więc, że nic się nie zmieniło i nadal standardem jest dostarczanie zarówno operatorowi przydziału kopiowania przez odniesienie do const, jak i operatorowi przypisania przeniesienia w prawo? – Mantracker

+0

@Mantracker: Powinieneś przeczytać połączoną odpowiedź. W rzeczywistości powinieneś przeczytać tę odpowiedź również na podstawie twojego oświadczenia _ "nadal normą jest dostarczanie zarówno operatorowi przydziału kopii przez odniesienie do const" _, co jest w bezpośredniej sprzeczności z tym, co powiedziałem. –

+3

BTW ładne pingwiny –

Powiązane problemy