Выбор ответа Middle Move-семантика спрашивают часто обновлено
Перемещение без noexcept и vector
Вопрос
У класса есть копирующий и перемещающий конструкторы, но перемещающий не помечен noexcept. Что делает std::vector при реаллокации?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Копирует элементы, чтобы сохранить строгую гарантию исключений. Если перенос элемента бросит исключение на середине, старый буфер уже частично разобран.
Варианты ответа
- Перемещает элементы как обычно,
noexceptвлияет только на оптимизацию - Вызывает
std::terminate, если перемещение выбросит исключение - Копирует элементы, чтобы сохранить строгую гарантию исключенийправильный ответ
- Не компилируется:
vectorтребуетnoexcept-перемещения у элементов
Разбор
Если перенос элемента бросит исключение на середине, старый буфер уже частично разобран. Поэтому vector перемещает через std::move_if_noexcept: при бросающем перемещении и доступном копировании выбирается копирование.
- Перемещать он будет, только если перемещение
noexceptили копирования нет вовсе. - terminate вызвался бы, если бы
noexcept-функция бросила, а здесьnoexceptнет. - Код компилируется, проблема только в скорости.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Move-семантика»
- Перенос между складами: map::extract без копий
- Топ участников: сортировка записей без копий строк
- lvalue, prvalue, xvalue
- std::move от const-объекта
- push_back и emplace_back
- std::exchange в перемещении
- Объясни move-семантику
- Допишите обёртку с perfect forwarding