Почему move должен быть noexcept
Вопрос
Почему перемещающий конструктор помечают noexcept?
Попробуйте сами
Ответьте про себя или вслух, потом откройте ответ и сверьтесь.
Показать ответ и разбор
Коротко
Ответ
При реаллокации std::vector обязан сохранить строгую гарантию: если перенос элемента бросит, старый буфер должен остаться целым. Поэтому он перемещает элементы только при noexcept-перемещении (std::move_if_noexcept), иначе копирует.
Разбор
При реаллокации std::vector обязан сохранить строгую гарантию: если перенос элемента бросит, старый буфер должен остаться целым. Поэтому он перемещает элементы только при noexcept-перемещении (std::move_if_noexcept), иначе копирует.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Объявили перемещающий конструктор
Следующий вопрос
Что выведет: деструктор отключил перемещение
Ещё по теме «Правило 0/3/5»
- Длинная арифметика: класс BigUint и факториал
- Класс матрицы 2×2 и быстрое возведение в степень
- Что даёт copy-and-swap
- Как написать оператор присваивания
- Куда пропал конструктор по умолчанию
- Пустой деструктор и перемещение
- Когда не генерируется перемещение
- Что объявили и что сгенерирует компилятор