Выбор ответа 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&&.

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

  1. Перемещение: a станет пустым, const снимается приведением
  2. Ошибка компиляции: std::move не принимает константные объекты
  3. Неопределённое поведение: перемещение меняет const-объект
  4. Копирование: const vector&& привяжется к копирующему конструкторуправильный ответ

Разбор

std::move(a) даёт const std::vector<int>&&. Перемещающий конструктор принимает неконстантную vector&& и не подходит, остаётся копирующий const vector&. Молча получаем копию тысячи элементов. clang-tidy ловит это проверкой performance-move-const-arg.

  • Перемещение не может менять const-объект.
  • Ошибки и UB нет.

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

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