Выбор ответа Senior Move-семантика обновлено
Категории значений
Вопрос
Дано std::string&& r = std::string("a");. Какая категория у выражения r?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: lvalue: это имя переменной, хоть она и rvalue-ссылка. Категория определяется видом выражения, а не типом переменной.
Варианты ответа
- xvalue: имя rvalue-ссылки обозначает «истекающий» объект
- lvalue: это имя переменной, хоть она и rvalue-ссылкаправильный ответ
- prvalue: ссылка указывает на временный объект
std::string - rvalue, потому что объявленный тип это rvalue-ссылка
Разбор
Категория определяется видом выражения, а не типом переменной. Именованная переменная, включая rvalue-ссылку, это lvalue. Поэтому, чтобы передать r дальше перемещением, нужен std::move(r).
- xvalue это, например,
std::move(r)или вызов функции, возвращающейT&&. - prvalue это
std::string("a")до привязки к ссылке. - Тип выражения (string) и категория (lvalue) это разные свойства.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Move-семантика»
- Перенос между складами: map::extract без копий
- Топ участников: сортировка записей без копий строк
- lvalue, prvalue, xvalue
- std::move от const-объекта
- push_back и emplace_back
- std::exchange в перемещении
- Объясни move-семантику
- Допишите обёртку с perfect forwarding