using-declaration: using using-declarator-list ;
using-declarator-list: using-declarator ... using-declarator-list , using-declarator ...
using-declarator: typename nested-name-specifier unqualified-id
struct B {
  void f(char);
  void g(char);
  enum E { e };
  union { int x; };
};
struct D : B {
  using B::f;
  void f(int) { f('c'); }       // calls B::f(char)
  void g(int) { g('c'); }       // recursively calls D::g(int)
}; — end example
template <typename... bases>
struct X : bases... {
  using bases::g...;
};
X<B, D> x;                      // OK: B::g and D::g introduced
 — end example
class C {
  int g();
};
class D2 : public B {
  using B::f;                   // OK: B is a base of D2
  using B::e;                   // OK: e is an enumerator of base B
  using B::x;                   // OK: x is a union member of base B
  using C::g;                   // error: C isn't a base of D2
}; — end example
struct A {
  template <class T> void f(T);
  template <class T> struct X { };
};
struct B : A {
  using A::f<double>;           // ill-formed
  using A::X<int>;              // ill-formed
}; — end example
struct X {
  int i;
  static int s;
};
void f() {
  using X::i;                   // error: X::i is a class member and this is not a member declaration.
  using X::s;                   // error: X::s is a class member and this is not a member declaration.
} — end example
void f();
namespace A {
  void g();
}
namespace X {
  using ::f;                    // global f
  using A::g;                   // A's g
}
void h()
{
  X::f();                       // calls ::f
  X::g();                       // calls A::g
} — end example
namespace A {
  int i;
}
namespace A1 {
  using A::i, A::i;             // OK: double declaration
}
struct B {
  int i;
};
struct X : B {
  using B::i, B::i;             // error: double member declaration
}; — end example
namespace A {
  void f(int);
}
using A::f;         // f is a synonym for A::f; that is, for A::f(int).
namespace A {
  void f(char);
}
void foo() {
  f('a');           // calls f(int), even though f(char) exists.
}
void bar() {
  using A::f;       // f is a synonym for A::f; that is, for A::f(int) and A::f(char).
  f('a');           // calls f(char)
} — end example
namespace A {
  int x;
}
namespace B {
  int i;
  struct g { };
  struct x { };
  void f(int);
  void f(double);
  void g(char);     // OK: hides struct g
}
void func() {
  int i;
  using B::i;       // error: i declared twice
  void f(char);
  using B::f;       // OK: each f is a function
  f(3.5);           // calls B::f(double)
  using B::g;
  g('a');           // calls B::g(char)
  struct g g1;      // g1 has class type B::g
  using B::x;
  using A::x;       // OK: hides struct B::x
  x = 99;           // assigns to A::x
  struct x x1;      // x1 has class type B::x
} — end example
namespace B {
  void f(int);
  void f(double);
}
namespace C {
  void f(int);
  void f(double);
  void f(char);
}
void h() {
  using B::f;       // B::f(int) and B::f(double)
  using C::f;       // C::f(int), C::f(double), and C::f(char)
  f('h');           // calls C::f(char)
  f(1);             // error: ambiguous: B::f(int) or C::f(int)?
  void f(int);      // error: f(int) conflicts with C::f(int) and B::f(int)
} — end example
struct B {
  virtual void f(int);
  virtual void f(char);
  void g(int);
  void h(int);
};
struct D : B {
  using B::f;
  void f(int);      // OK: D::f(int) overrides B::f(int);
  using B::g;
  void g(char);     // OK
  using B::h;
  void h(int);      // OK: D::h(int) hides B::h(int)
};
void k(D* p)
{
  p->f(1);          // calls D::f(int)
  p->f('a');        // calls B::f(char)
  p->g(1);          // calls B::g(int)
  p->g('a');        // calls D::g(char)
}
struct B1 {
  B1(int);
};
struct B2 {
  B2(int);
};
struct D1 : B1, B2 {
  using B1::B1;
  using B2::B2;
};
D1 d1(0);           // ill-formed: ambiguous
struct D2 : B1, B2 {
  using B1::B1;
  using B2::B2;
  D2(int);          // OK: D2::D2(int) hides B1::B1(int) and B2::B2(int)
};
D2 d2(0);           // calls D2::D2(int)
 — end example
struct A { int x(); };
struct B : A { };
struct C : A {
  using A::x;
  int x(int);
};
struct D : B, C {
  using C::x;
  int x(double);
};
int f(D* d) {
  return d->x();    // error: overload resolution selects A::x, but A is an ambiguous base class
} — end example
class A {
private:
    void f(char);
public:
    void f(int);
protected:
    void g();
};
class B : public A {
  using A::f;       // error: A::f(char) is inaccessible
public:
  using A::g;       // B::g is a public synonym for A::g
}; — end example