Когда идиома копирования и обмена не применима

После прочтения этот о идиоме копирования и обмена, которую я прочитал этот который говорит под (2):

class_name & class_name :: operator= ( const class_name & )     (2)

(2) Типичное объявление оператора присваивания копии, когда
идиома копирования и обмена не может быть использован

Когда следует избегать использования идиомы копирования и обмена?

А когда это вообще «нельзя использовать»?

Существуют ли в реальной жизни случаи, когда копирование и замена и правило нуля не применимы?

Я нашел это вопрос но он был слишком конкретным и не содержал каких-либо указаний относительно того, как выявлять такие случаи.

13

Решение

Когда следует избегать использования идиомы копирования и обмена?

Когда вы можете доказать, что наивная копия безопасна и быстрее, чем swap,

Вы можете определить случай, когда нет указателей (ни умных, ни сырых), которые бы принадлежали объектам, и это верно для всех объектов-членов.

А когда это вообще «нельзя использовать»?

Копирование и замена не могут быть использованы, если тип не замена.

Чтобы быть заменяемым, тип должен быть или move-constructible и move-assignable, или вы должны были определить swap функция-член или функция-друг.

7

Другие решения

Ваша ссылка с описанием возможных реализаций оператора присваивания описана 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&)

Указывает, что это будет на реализаторе любых дочерних классов, чтобы гарантировать, что достаточная проверка сделана, чтобы пройти тест на самостоятельное назначение.

2