После прочтения этот о идиоме копирования и обмена, которую я прочитал этот который говорит под (2):
class_name & class_name :: operator= ( const class_name & ) (2)
(2) Типичное объявление оператора присваивания копии, когда
идиома копирования и обмена не может быть использован
Когда следует избегать использования идиомы копирования и обмена?
А когда это вообще «нельзя использовать»?
Существуют ли в реальной жизни случаи, когда копирование и замена и правило нуля не применимы?
Я нашел это вопрос но он был слишком конкретным и не содержал каких-либо указаний относительно того, как выявлять такие случаи.
Когда следует избегать использования идиомы копирования и обмена?
Когда вы можете доказать, что наивная копия безопасна и быстрее, чем swap
,
Вы можете определить случай, когда нет указателей (ни умных, ни сырых), которые бы принадлежали объектам, и это верно для всех объектов-членов.
А когда это вообще «нельзя использовать»?
Копирование и замена не могут быть использованы, если тип не замена.
Чтобы быть заменяемым, тип должен быть или move-constructible и move-assignable, или вы должны были определить swap
функция-член или функция-друг.
Ваша ссылка с описанием возможных реализаций оператора присваивания описана class_name& class_name::operator=(class_name)
как:
Типичное объявление оператора присваивания копии, когда можно использовать идиому копирования и замены
А также class_name& class_name::operator=(const class_name&)
как:
Типичное объявление оператора присваивания копии, когда идиома копирования и замены не может использоваться
По сути, мы всегда хотели бы использовать копирование и обмен, когда это возможно, как указано в отличный ответ на ваш связанный вопрос, потому что он пройдет тест на самостоятельное назначение.
Итак, теперь вопрос в том, почему конвенция упоминается http://www.cppreference.com?
Допустим, я реализую конструктор копирования в виртуальном классе, и я хочу прояснить всем, кто унаследует, что они должны использовать идиому копирования и замены. Как бы я это сделал? Я мог бы помочь им, сделав копию для них при первом вызове:
class_name& class_name::operator=(class_name)
Это копия по значению, поэтому разработчик любых дочерних классов увидит, что я уже сделал копию для них, поэтому все, что им нужно будет сделать, это поменять местами.
Теперь, что если бы у меня был class_name
который содержит член, который не может быть создан с помощью копирования, например, что если мой класс имеет unique_ptr
такой, что это не может быть построено копированием. Я могу указать, что не создание аргумента копирования по значению для оператора присваивания, например:
class_name& class_name::operator(const class_name&)
Указывает, что это будет на реализаторе любых дочерних классов, чтобы гарантировать, что достаточная проверка сделана, чтобы пройти тест на самостоятельное назначение.