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ć?
'operator = (ArrayStack)' nie ma powodu, aby utworzyć kopię 'tmp'. – aschepler
http://www.slideshare.net/ripplelabs/howard-hinnant-accu2014 slajdy 43-53 –
Wersja pass-by-value może wykonywać zarówno przeniesienie, jak i kopiowanie, zwykle przez kopiowanie i zamianę. –