Выбор ответа Middle Правило 0/3/5 спрашивают часто обновлено

Пустой деструктор и перемещение

Вопрос

В класс с членом std::vector<int> v; добавили ~Widget() {}. Что стало с перемещением Widget?

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

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

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

Коротко

Правильный ответ: Перемещение больше не генерируется, std::move(w) вызовет копирование. Пользовательский деструктор подавляет неявное объявление перемещающего конструктора и присваивания.

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

  1. Перемещение больше не генерируется, std::move(w) вызовет копированиеправильный ответ
  2. Ничего не изменилось: пустой деструктор не влияет на генерацию функций
  3. Перемещение стало запрещено, код с std::move не скомпилируется
  4. Перемещение стало быстрее: деструктор источника теперь ничего не делает

Разбор

Пользовательский деструктор подавляет неявное объявление перемещающего конструктора и присваивания. Rvalue тогда связывается с копирующим конструктором (он ещё генерируется, хотя это устарело), и вектор копируется.

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

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

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