Какие шаги я должен предпринять, чтобы определить категорию значения выражения?
Я довольно озадачен определением ценностной категории выражения. Не могли бы вы предоставить основные шаги, которые следует предпринять (что следует проанализировать) для определения категории значения выражения?
1 ответ
Если вы просто хотите получить быстрый и обычно правильный ответ, примите во внимание следующие правила:
- Если это функция или уже существующий объект, то это glvalue.
- Большинство glvalues являются lvalues.
- xvalues - это то, что может быть конкретно перемещено из: приведение к ссылочному типу rvalue или вызов функции, где возвращаемый тип функции является ссылочным типом rvalue (особенно
std::move
а иногдаstd::forward
).
- Если это просто значение или способ создания нового объекта, тогда это значение.
Но есть некоторые случаи, когда категория все еще может быть неясной. И вышесказанное предполагает некоторые упрощения (в частности, правила для A.B
а также A ? B : C
более сложные).
Единственный действительно надежный способ - найти ответ в Стандарте.
Определите, какое у вас выражение с точки зрения грамматики. Буквальный? Выражение оператора? Лямбда? И т.п.
Если выражение является операторным выражением, выясните, выберет ли разрешение перегрузки некоторую перегруженную операторную функцию или встроенный оператор-кандидат, как описано в [over.match.oper], [over.oper] и [over.built].,
Если выражение фактически является вызовом перегруженной операторной функции, категория значения определяется по типу возврата операторской функции, выбранной с помощью разрешения перегрузки, как описано в [expr.call]. В этом случае игнорируйте описание поведения встроенного оператора для этой цели.
В противном случае найдите раздел [expr.prim] или [expr.compound] (см. Оглавление) для грамматической формы выражения. В этом разделе будет указано, как определяется категория значения выражения. Часто бывает необходимо знать типы и категории значений любых подвыражений, поэтому вам может понадобиться рекурсивно следовать этим правилам.