Выбор ответа Senior Правило 0/3/5 обновлено

Что даёт copy-and-swap

Вопрос

Оператор присваивания реализован как T& operator=(T other) noexcept { swap(other); return *this; }. Что это даёт?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Строгую гарантию исключений и защиту от самоприсваивания одной реализацией. Копия создаётся при передаче аргумента: если она бросит исключение, this не тронут.

Варианты ответа

  1. Строгую гарантию исключений и защиту от самоприсваивания одной реализациейправильный ответ
  2. Нулевую стоимость: никакой копии не создаётся благодаря swap
  3. Гарантию отсутствия исключений при копировании: оператор помечен noexcept
  4. Ничего: это устаревший стиль, нарушающий правило пяти

Разбор

Копия создаётся при передаче аргумента: если она бросит исключение, *this не тронут. Обмен noexcept не бросает, старые ресурсы уходят в деструктор other. a = a тоже работает. Если передать rvalue, аргумент сконструируется перемещением, и тот же оператор служит перемещающим присваиванием.

  • Копия есть, и это цена идиомы: лишняя аллокация, даже если у цели уже хватало памяти.
  • Копирование может бросить, просто это происходит до входа в функцию.
  • Идиома совместима с правилом пяти и используется широко.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.