Выбор ответа Senior Правило 0/3/5 обновлено
Что даёт copy-and-swap
Вопрос
Оператор присваивания реализован как T& operator=(T other) noexcept { swap(other); return *this; }. Что это даёт?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Строгую гарантию исключений и защиту от самоприсваивания одной реализацией. Копия создаётся при передаче аргумента: если она бросит исключение, this не тронут.
Варианты ответа
- Строгую гарантию исключений и защиту от самоприсваивания одной реализациейправильный ответ
- Нулевую стоимость: никакой копии не создаётся благодаря
swap - Гарантию отсутствия исключений при копировании: оператор помечен
noexcept - Ничего: это устаревший стиль, нарушающий правило пяти
Разбор
Копия создаётся при передаче аргумента: если она бросит исключение, *this не тронут. Обмен noexcept не бросает, старые ресурсы уходят в деструктор other. a = a тоже работает. Если передать rvalue, аргумент сконструируется перемещением, и тот же оператор служит перемещающим присваиванием.
- Копия есть, и это цена идиомы: лишняя аллокация, даже если у цели уже хватало памяти.
- Копирование может бросить, просто это происходит до входа в функцию.
- Идиома совместима с правилом пяти и используется широко.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Класс матрицы 2×2 и быстрое возведение в степень
Следующий вопрос
Как написать оператор присваивания
Ещё по теме «Правило 0/3/5»
- Длинная арифметика: класс BigUint и факториал
- Куда пропал конструктор по умолчанию
- Пустой деструктор и перемещение
- Когда не генерируется перемещение
- Что объявили и что сгенерирует компилятор
- Объявили перемещающий конструктор
- Почему move должен быть noexcept
- Что выведет: деструктор отключил перемещение