Выбор ответа Middle Move-семантика спрашивают часто обновлено

Перемещение без noexcept и vector

Вопрос

У класса есть копирующий и перемещающий конструкторы, но перемещающий не помечен noexcept. Что делает std::vector при реаллокации?

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

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

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

Коротко

Правильный ответ: Копирует элементы, чтобы сохранить строгую гарантию исключений. Если перенос элемента бросит исключение на середине, старый буфер уже частично разобран.

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

  1. Перемещает элементы как обычно, noexcept влияет только на оптимизацию
  2. Вызывает std::terminate, если перемещение выбросит исключение
  3. Копирует элементы, чтобы сохранить строгую гарантию исключенийправильный ответ
  4. Не компилируется: vector требует noexcept-перемещения у элементов

Разбор

Если перенос элемента бросит исключение на середине, старый буфер уже частично разобран. Поэтому vector перемещает через std::move_if_noexcept: при бросающем перемещении и доступном копировании выбирается копирование.

  • Перемещать он будет, только если перемещение noexcept или копирования нет вовсе.
  • terminate вызвался бы, если бы noexcept-функция бросила, а здесь noexcept нет.
  • Код компилируется, проблема только в скорости.

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

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