8 Expressions [expr]

8.1 Primary expressions [expr.prim]

8.1.4 Names [expr.prim.id]

id-expression:
	unqualified-id
	qualified-id

An id-expression- это ограниченная форма primary-expression. [ Может появиться после . ]Note: id-expression. and -> operatorsend note

Можно id-expressionиспользовать только нестатический член данных или нестатическую функцию-член класса:

  • как часть, class member access в которой выражение объекта относится к классу члена65 или классу, производному от этого класса, или

  • чтобы сформировать указатель на member ([expr.unary.op]), или

  • если это id-expressionобозначает нестатический член данных и появляется в неоцененном операнде. [Example:

    struct S {
      int m;
    };
    int i = sizeof(S::m);           // OK
    int j = sizeof(S::m + 42);      // OK
    

    end example]

Это также применимо, когда объектное выражение является неявным (*this) ([class.mfct.non-static]).

8.1.4.1 Unqualified names [expr.prim.id.unqual]

unqualified-id:
	identifier
	operator-function-id
	conversion-function-id
	literal-operator-id
	~ class-name
	~ decltype-specifier
	template-id

identifierПриведено при id-expressionусловии , что было соответствующим образом объявлено (пункт [dcl.dcl]). [ Note: Для получения operator-function-idsсм [over.oper]; для conversion-function-ids, см [class.conv.fct]; для literal-operator-ids, см [over.literal]; для template-ids, см [temp.names]. A class-name или с decltype-specifier префиксом ~ означает деструктор; см [class.dtor]. В определении нестатической функции-члена, identifierимя нестатического члена преобразуется в выражение доступа к члену класса ([class.mfct.non-static]). ] Тип выражения - это тип . Результатом является сущность, обозначенная идентификатором. Выражение является lvalue, если сущность является функцией, переменной или членом данных, и prvalue в противном случае; это битовое поле, если идентификатор обозначает битовое поле ( ).end noteidentifier[dcl.struct.bind]

8.1.4.2 Qualified names [expr.prim.id.qual]

qualified-id:
	nested-name-specifier templateopt unqualified-id

nested-name-specifier:
	::
	type-name ::
	namespace-name ::
	decltype-specifier ::
	nested-name-specifier identifier ::
	nested-name-specifier templateopt simple-template-id ::

Тип, обозначенный a decltype-specifierв a, nested-name-specifierдолжен быть классом или перечислимым типом.

A nested-name-specifier, обозначающий класс, за которым может следовать ключевое слово template ([temp.names]), а затем имя члена этого класса ([class.mem]) или одного из его base classes, - это a ; описывает поиск по имени для членов класса, которые появляются в . Результат - член. Тип результата - это тип члена. Результатом является lvalue, если член является статической функцией-членом или членом данных, и prvalue в противном случае. [К члену класса можно обратиться с помощью a в любой точке его потенциальной области видимости ( ). ] Где используется, оба должны относиться к одному и тому же классу; это обозначение именует . Форма также обозначает деструктор, но она не должна использоваться в качестве элемента в a . [ Имя класса - это ( ). ]qualified-id [class.qual] qualified-idsNote: qualified-id[basic.scope.class]end noteclass-name ​::​~ class-nameclass-names destructor ~ decltype-specifierunqualified-idqualified-idNote: typedef-nameclass-name[class.name]end note

В nested-name-specifier ​::​ именах глобального пространства имен. A, nested-name-specifierкоторый называет пространство имен ([basic.namespace]), за которым необязательно следует ключевое слово template ([temp.names]), а затем следует имя члена этого пространства имен (или имя члена пространства имен, сделанное видимым с помощью a using-directive), является a ; описывает поиск по именам для членов пространства имен, которые появляются в . Результат - член. Тип результата - это тип члена. Результатом является lvalue, если член является функцией или переменной, и prvalue в противном случае.qualified-id [namespace.qual] qualified-ids

A, nested-name-specifierкоторый обозначает enumeration, за которым следует имя перечислителя этого перечисления, является a, qualified-id который ссылается на перечислитель. Результат - счетчик. Тип результата - это тип перечисления. Результат - prvalue.

В a qualified-id, если unqualified-id является a conversion-function-id, он conversion-type-id должен обозначать один и тот же тип как в контексте, в котором qualified-idпроисходит целое, так и в контексте класса, обозначенного nested-name-specifier.