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 подскажет развёрнутый ответ в реальном времени.