Ваша ссылка с описанием возможных реализаций оператора присваивания описаны class_name& class_name::operator=(class_name)
как:
Типичное объявление оператора присваивания копии, когда копирование и своп идиома может быть использован
И class_name& class_name::operator=(const class_name&)
как :
Типичное объявление оператора присваивания копии при невозможности использования идиомы копирования и свопинга
В основном мы всегда хотим использовать скопировать и своп, когда это возможно, как уже упоминалось в excellent answer to your linked question, потому что он будет проходить тест на себя задание.
Так что теперь вопрос в том, почему конвенция упомянута на http://www.cppreference.com?
Предположим, что я реализую конструктор копирования для виртуального класса, и я хочу дать понять всем, кто наследует, что они должны использовать идиому копирования и свопинга. Как мне это сделать?Я мог бы помочь им, делая копию для них в первоначальном вызове:
class_name& class_name::operator=(class_name)
Это копия по значению, поэтому реализатор всех дочерних классов будет видеть, что я уже сделал копию для них, так что все им нужно будет поменять местами.
Теперь, если бы у меня был class_name
, который содержал элемент, который не мог быть скопирован, например, что, если мой класс имеет unique_ptr
, так что он не может быть создан для копирования. Я могу указать, что не сделать копию с помощью значения аргумента оператора присваивания, например:
class_name& class_name::operator(const class_name&)
Указав будет на реализатора любых дочерних классов, чтобы обеспечить достаточную проверку делается передать себя -адаптация.
Как правило, копирование и своп * легко * и * безопасно *, но, возможно, не оптимально с точки зрения скорости. Например, присваивая два контейнера из миллиона элементов, вероятно, быстрее выполнить миллион заданий, чем выполнить миллионы конструкций и миллион разрушений. –
@ user2079303 спасибо, что приговор был пьян, ему пришлось идти домой. Надеюсь, теперь это ясно. – Darius
Реальные случаи жизни, когда копия/своп убивает вашу производительность: http://stackoverflow.com/a/25942402/576911 –