Какие шаги я должен предпринять, чтобы определить категорию значения выражения?

Я довольно озадачен определением ценностной категории выражения. Не могли бы вы предоставить основные шаги, которые следует предпринять (что следует проанализировать) для определения категории значения выражения?

1 ответ

Решение

Если вы просто хотите получить быстрый и обычно правильный ответ, примите во внимание следующие правила:

  • Если это функция или уже существующий объект, то это glvalue.
    • Большинство glvalues ​​являются lvalues.
    • xvalues ​​- это то, что может быть конкретно перемещено из: приведение к ссылочному типу rvalue или вызов функции, где возвращаемый тип функции является ссылочным типом rvalue (особенно std::move а иногда std::forward).
  • Если это просто значение или способ создания нового объекта, тогда это значение.

Но есть некоторые случаи, когда категория все еще может быть неясной. И вышесказанное предполагает некоторые упрощения (в частности, правила для A.B а также A ? B : C более сложные).

Единственный действительно надежный способ - найти ответ в Стандарте.

  1. Определите, какое у вас выражение с точки зрения грамматики. Буквальный? Выражение оператора? Лямбда? И т.п.

  2. Если выражение является операторным выражением, выясните, выберет ли разрешение перегрузки некоторую перегруженную операторную функцию или встроенный оператор-кандидат, как описано в [over.match.oper], [over.oper] и [over.built].,

  3. Если выражение фактически является вызовом перегруженной операторной функции, категория значения определяется по типу возврата операторской функции, выбранной с помощью разрешения перегрузки, как описано в [expr.call]. В этом случае игнорируйте описание поведения встроенного оператора для этой цели.

  4. В противном случае найдите раздел [expr.prim] или [expr.compound] (см. Оглавление) для грамматической формы выражения. В этом разделе будет указано, как определяется категория значения выражения. Часто бывает необходимо знать типы и категории значений любых подвыражений, поэтому вам может понадобиться рекурсивно следовать этим правилам.

Другие вопросы по тегам