typedef int f;
namespace N {
  struct A {
    friend void f(A &);
    operator int();
    void g(A a) {
      int i = f(a);  // f is the typedef, not the friend function: equivalent to int(a)
    }
  };
}
namespace A {
  namespace N {
    void f();
  }
}
void A::N::f() {
  i = 5;
  // The following scopes are searched for a declaration of i:
  // 1) outermost block scope of A::N::f, before the use of i
  // 2) scope of namespace N
  // 3) scope of namespace A
  // 4) global scope, before the definition of A::N::f
} — end example
namespace M {
  class B { };
} 
namespace N {
  class Y : public M::B {
    class X {
      int a[i];
    };
  };
}
// The following scopes are searched for a declaration of i:
// 1) scope of class N::Y::X, before the use of i
// 2) scope of class N::Y, before the definition of N::Y::X
// 3) scope of N::Y's base class M::B
// 4) scope of namespace N, before the definition of N::Y
// 5) global scope, before the definition of N
 — end example
class B { };
namespace M {
  namespace N {
    class X : public B {
      void f();
    };
  }
}
void M::N::X::f() {
  i = 16;
}
// The following scopes are searched for a declaration of i:
// 1) outermost block scope of M::N::X::f, before the use of i
// 2) scope of class M::N::X
// 3) scope of M::N::X's base class B
// 4) scope of namespace M::N
// 5) scope of namespace M
// 6) global scope, before the definition of M::N::X::f
 — end example
struct A {
  typedef int AT;
  void f1(AT);
  void f2(float);
  template <class T> void f3();
};
struct B {
  typedef char AT;
  typedef float BT;
  friend void A::f1(AT);      // parameter type is A::AT
  friend void A::f2(BT);      // parameter type is B::BT
  friend void A::f3<AT>();    // template argument is B::AT
}; — end example
namespace N {
  int i = 4;
  extern int j;
}
int i = 2;
int N::j = i;       // N::j == 4
 — end example
namespace N {
  struct S { };
  void f(S);
}
void g() {
  N::S s;
  f(s);             // OK: calls N::f
  (f)(s);           // error: N::f not considered; parentheses prevent argument-dependent lookup
} — end example
namespace NS {
  class T { };
  void f(T);
  void g(T, int);
}
NS::T parm;
void g(NS::T, float);
int main() {
  f(parm);                      // OK: calls NS::f
  extern void g(NS::T, float);
  g(parm, 1);                   // OK: calls g(NS::T, float)
} — end example
class A {
public:
  static int n;
};
int main() {
  int A;
  A::n = 42;        // OK
  A b;              // ill-formed: A does not name a type
} — end example
class X { };
class C {
  class X { };
  static const int number = 50;
  static X arr[number];
};
X C::arr[number];   // ill-formed:
                    // equivalent to ::X C::arr[C::number];
                    // and not to C::X C::arr[C::number];
 — end examplenested-name-specifier class-name :: ~ class-name
struct C {
  typedef int I;
};
typedef int I1, I2;
extern int* p;
extern int* q;
p->C::I::~I();      // I is looked up in the scope of C
q->I1::~I2();       // I2 is looked up in the scope of the postfix-expression
struct A {
  ~A();
};
typedef A AB;
int main() {
  AB* p;
  p->AB::~AB();     // explicitly calls the destructor for A
} — end example
struct A { A(); };
struct B: public A { B(); };
A::A() { }
B::B() { }
B::A ba;            // object of type A
A::A a;             // error, A::A is not a type name
struct A::A a2;     // object of type A
 — end example
int x;
namespace Y {
  void f(float);
  void h(int);
}
namespace Z {
  void h(double);
}
namespace A {
  using namespace Y;
  void f(int);
  void g(int);
  int i;
}
namespace B {
  using namespace Z;
  void f(char);
  int i;
}
namespace AB {
  using namespace A;
  using namespace B;
  void g();
}
void h()
{
  AB::g();          // g is declared directly in AB, therefore S is { AB::g() } and AB::g() is chosen
  AB::f(1);         // f is not declared directly in AB so the rules are applied recursively to A and B;
                    // namespace Y is not searched and Y::f(float) is not considered;
                    // S is  and overload resolution chooses A::f(int)
  AB::f('c');       // as above but resolution chooses B::f(char)
  AB::x++;          // x is not declared directly in AB, and is not declared in A or B, so the rules
                    // are applied recursively to Y and Z, S is { } so the program is ill-formed
  AB::i++;          // i is not declared directly in AB so the rules are applied recursively to A and B,
                    // S is  so the use is ambiguous and the program is ill-formed
  AB::h(16.8);      // h is not declared directly in AB and not declared directly in A or B so the rules
                    // are applied recursively to Y and Z, S is  and
                    // overload resolution chooses Z::h(double)
} — end example
namespace A {
  int a;
}
namespace B {
  using namespace A;
}
namespace C {
  using namespace A;
}
namespace BC {
  using namespace B;
  using namespace C;
}
void f()
{
  BC::a++;          // OK: S is 
}
namespace D {
  using A::a;
}
namespace BD {
  using namespace B;
  using namespace D;
}
void g()
{
  BD::a++;          // OK: S is 
} — end example
namespace B {
  int b;
}
namespace A {
  using namespace B;
  int a;
}
namespace B {
  using namespace A;
}
void f()
{
  A::a++;           // OK: a declared directly in A, S is { A::a }
  B::a++;           // OK: both A and B searched (once), S is { A::a }
  A::b++;           // OK: both A and B searched (once), S is { B::b }
  B::b++;           // OK: b declared directly in B, S is { B::b }
} — end example
namespace A {
  struct x { };
  int x;
  int y;
}
namespace B {
  struct y { };
}
namespace C {
  using namespace A;
  using namespace B;
  int i = C::x;     // OK, A::x (of type int)
  int j = C::y;     // ambiguous, A::y or B::y
} — end examplenested-name-specifier unqualified-id
namespace A {
  namespace B {
    void f1(int);
  }
  using namespace B;
}
void A::f1(int){ }  // ill-formed, f1 is not a member of A
 — end example
namespace A {
  namespace B {
    void f1(int);
  }
}
namespace C {
  namespace D {
    void f1(int);
  }
}
using namespace A;
using namespace C::D;
void B::f1(int){ }  // OK, defines A::B::f1(int)
 — end exampleclass-key attribute-specifier-seq identifier ;
class-key attribute-specifier-seq identifier ;
struct Node {
  struct Node* Next;            // OK: Refers to Node at global scope
  struct Data* Data;            // OK: Declares type Data
                                // at global scope and member Data
};
struct Data {
  struct Node* Node;            // OK: Refers to Node at global scope
  friend struct ::Glob;         // error: Glob is not declared, cannot introduce a qualified type ([dcl.type.elab])
  friend struct Glob;           // OK: Refers to (as yet) undeclared Glob at global scope.
  /* ... */
};
struct Base {
  struct Data;                  // OK: Declares nested Data
  struct ::Data*     thatData;  // OK: Refers to ::Data
  struct Base::Data* thisData;  // OK: Refers to nested Data
  friend class ::Data;          // OK: global Data is a friend
  friend class Data;            // OK: nested Data is a friend
  struct Data { /* ... */ };    // Defines nested Data
};
struct Data;                    // OK: Redeclares Data at global scope
struct ::Data;                  // error: cannot introduce a qualified type ([dcl.type.elab])
struct Base::Data;              // error: cannot introduce a qualified type ([dcl.type.elab])
struct Base::Datum;             // error: Datum undefined
struct Base::Data* pBase;       // OK: refers to nested Data
 — end example
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 exampleclass-name-or-namespace-name::...the class-name-or-namespace-name following the . or -> operator is first looked up in the class of the object expression and the name, if found, is used.
::class-name-or-namespace-name::...the class-name-or-namespace-name is looked up in global scope as a class-name or namespace-name.
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