6 Basic concepts [basic]

6.4 Name lookup [basic.lookup]

6.4.5 Class member access [basic.lookup.classref]

В class member access выражении, если за токеном . или -> сразу следует символ, за которым identifier следует символ <, необходимо найти идентификатор, чтобы определить, < является ли это началом списка аргументов шаблона ([temp.names]) или оператором «меньше». Идентификатор сначала ищется в классе выражения объекта. Если идентификатор не найден, он затем ищется в контексте всего postfix-expressionи должен дать имя шаблону класса.

Если id-expressionin a class member access - это unqualified-id, а тип выражения объекта относится к типу класса C, unqualified-idищется в области действия класса C. Для pseudo-destructor call, то unqualified-idищется в контексте полной postfix-expression.

Если unqualified-idесть , то ищется в контексте всего . Если тип объектного выражения относится к типу класса , он также ищется в области действия класса . По крайней мере, один из поисков должен найти имя, которое относится к . [ ~type-nametype-namepostfix-expression T Ctype-name C cv TExample:

struct A { };

struct B {
  struct A { };
  void f(::A* a);
};

void B::f(::A* a) {
  a->~A();                      // OK: lookup in *a finds the injected-class-name
}

end example]

Если id-expressionдоступ для члена класса имеет qualified-idформу

class-name-or-namespace-name::...

class-name-or-namespace-name следуя . или -> оператор сначала ищется в классе выражения объекта и имя, если он найден, используется. В противном случае он ищется в контексте всего postfix-expression. [ Note: См. [basic.lookup.qual], Где описан поиск имени ранее ​::​, при котором будет найден только тип или имя пространства имен. ] end note

Если qualified-idимеет вид

::class-name-or-namespace-name::...

class-name-or-namespace-name ищется в глобальном масштабе в виде class-nameили namespace-name.

Если nested-name-specifierсодержит a simple-template-id, имена в нем template-arguments ищутся в контексте, в котором postfix-expressionвстречается все.

Если id-expressionэто a conversion-function-id, его conversion-type-id сначала ищут в классе выражения объекта, и имя, если оно найдено, используется. В противном случае он ищется в контексте всего postfix-expression. В каждом из этих поисков учитываются только имена, обозначающие типы или шаблоны, специализацией которых являются типы. [Example:

struct A { };
namespace N {
  struct A {
    void g() { }
    template <class T> operator T();
  };
}

int main() {
  N::A a;
  a.operator A();               // calls N​::​A​::​operator N​::​A
}

end example]