10 Declarations [dcl.dcl]

10.3 Namespaces [basic.namespace]

10.3.1 Namespace definition [namespace.def]

10.3.1.2 Namespace member definitions [namespace.memdef]

Объявление в пространстве имен N (за исключением объявлений во вложенных областях), declarator-idкоторое является unqualified-id([dcl.meaning]), class-head-nameили enum-head-nameявляется identifier, или elaborated-type-specifierимеет форму ( ), или это , объявляет (или повторно объявляет) его или в качестве члена . [ Или шаблон не ввести имя и , таким образом , может быть объявлено используя в качестве члена множества вшито пространства имен, если основной шаблон объявлен в инлайн пространстве имен. ] [class-key attribute-specifier-seqopt identifier[dcl.type.elab]opaque-enum-declarationunqualified-ididentifier NNote: explicit instantiation explicit specialization unqualified-idend noteExample:

namespace X {
  void f() { /* ... */ }        // OK: introduces X​::​f()

  namespace M {
    void g();                   // OK: introduces X​::​M​::​g()
  }
  using M::g;
  void g();                     // error: conflicts with X​::​M​::​g()
}

end example]

Члены именованного пространства имен также могут быть определены вне этого пространства имен с помощью явной qualification ([namespace.qual]) определяемого имени при условии, что определяемая сущность уже была объявлена ​​в пространстве имен и определение появляется после точки объявления в пространстве имен, которое включает пространство имен декларации. [Example:

namespace Q {
  namespace V {
    void f();
  }
  void V::f() { /* ... */ }     // OK
  void V::g() { /* ... */ }     // error: g() is not yet a member of V
  namespace V {
    void g();
  }
}

namespace R {
  void Q::V::g() { /* ... */ }  // error: R doesn't enclose Q
}

end example]

Если friend объявление в нелокальном классе сначала объявляет класс, функцию, шаблон класса или шаблон функции,97 то друг является членом самого внутреннего включающего пространства имен. friend Декларация сама по себе не делает имя видимым для неквалифицированного поиска ([basic.lookup.unqual]) или квалифицированного поиска ([basic.lookup.qual]). [ Note: Имя друга будет видно в его пространстве имен, если соответствующее объявление предоставлено в области пространства имен (либо до, либо после определения класса, предоставляющего дружбу). ] Если вызывается дружественная функция или шаблон функции, ее имя можно найти с помощью поиска по именам, который рассматривает функции из пространств имен и классов, связанных с типами аргументов функции ( ). Если имя в объявлении не является ни квалифицированным, ни a, а объявление является функцией или объектом, поиск для определения того, была ли объект объявлен ранее, не должен учитывать какие-либо области за пределами самого внутреннего включающего пространства имен. [ Другие формы объявлений не могут объявлять новый член самого внутреннего включающего пространства имен и, таким образом, следовать обычным правилам поиска. ] [end note[basic.lookup.argdep] friend template-idelaborated-type-specifierNote: friend end noteExample:

// Assume f and g have not yet been declared.
void h(int);
template <class T> void f2(T);
namespace A {
  class X {
    friend void f(X);           // A​::​f(X) is a friend
    class Y {
      friend void g();          // A​::​g is a friend
      friend void h(int);       // A​::​h is a friend
                                // ​::​h not considered
      friend void f2<>(int);    // ​::​f2<>(int) is a friend
    };
  };

  // A​::​f, A​::​g and A​::​h are not visible here
  X x;
  void g() { f(x); }            // definition of A​::​g
  void f(X) { /* ... */ }       // definition of A​::​f
  void h(int) { /* ... */ }     // definition of A​::​h
  // A​::​f, A​::​g and A​::​h are visible here and known to be friends
}

using A::x;

void h() {
  A::f(x);
  A::X::f(x);                   // error: f is not a member of A​::​X
  A::X::Y::g();                 // error: g is not a member of A​::​X​::​Y
}

end example]

это означает, что имя класса или функции неквалифицировано.