Hardзначения
Что такое value category lvalue/xvalue/prvalue?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
В C++11 выражения делятся по двум осям: имеет идентичность (можно взять адрес) и можно перемещать (скоро умрёт). Отсюда три основные категории.
std::string s = "hi";
s; // lvalue — есть идентичность, нельзя перемещать
std::move(s); // xvalue — есть идентичность, можно перемещать
std::string("x"); // prvalue — нет идентичности, можно перемещать
42; // prvalue- lvalue — именованная переменная,
*p,arr[i]; - xvalue (expiring) —
std::move(x), результат функции, возвращающейT&&; - prvalue (pure rvalue) — литерал, результат функции по значению;
- glvalue = lvalue ∪ xvalue; rvalue = xvalue ∪ prvalue.
rvalue bind к T&& и trigger move; lvalue bind к T& и trigger copy.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.