Выбор ответа Middle Move-семантика обновлено
std::move от const-объекта
Вопрос
Что произойдёт при const std::vector<int> a(1000); auto b = std::move(a);?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Копирование: const vector&& привяжется к копирующему конструктору. std::move(a) даёт const std::vector<int&&.
Варианты ответа
- Перемещение:
aстанет пустым,constснимается приведением - Ошибка компиляции:
std::moveне принимает константные объекты - Неопределённое поведение: перемещение меняет
const-объект - Копирование:
const vector&&привяжется к копирующему конструкторуправильный ответ
Разбор
std::move(a) даёт const std::vector<int>&&. Перемещающий конструктор принимает неконстантную vector&& и не подходит, остаётся копирующий const vector&. Молча получаем копию тысячи элементов. clang-tidy ловит это проверкой performance-move-const-arg.
- Перемещение не может менять
const-объект. - Ошибки и UB нет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Move-семантика»
- Перенос между складами: map::extract без копий
- Топ участников: сортировка записей без копий строк
- std::exchange в перемещении
- Объясни move-семантику
- Допишите обёртку с perfect forwarding
- move или forward в шаблоне
- Что такое T&& в шаблоне
- Состояние после перемещения