Выбор ответа Senior Move-семантика обновлено

Категории значений

Вопрос

Дано std::string&& r = std::string("a");. Какая категория у выражения r?

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

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

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

Коротко

Правильный ответ: lvalue: это имя переменной, хоть она и rvalue-ссылка. Категория определяется видом выражения, а не типом переменной.

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

  1. xvalue: имя rvalue-ссылки обозначает «истекающий» объект
  2. lvalue: это имя переменной, хоть она и rvalue-ссылкаправильный ответ
  3. prvalue: ссылка указывает на временный объект std::string
  4. rvalue, потому что объявленный тип это rvalue-ссылка

Разбор

Категория определяется видом выражения, а не типом переменной. Именованная переменная, включая rvalue-ссылку, это lvalue. Поэтому, чтобы передать r дальше перемещением, нужен std::move(r).

  • xvalue это, например, std::move(r) или вызов функции, возвращающей T&&.
  • prvalue это std::string("a") до привязки к ссылке.
  • Тип выражения (string) и категория (lvalue) это разные свойства.

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

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