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