FWIW I dug up my copy of the C++ Standard, and here's what we have.
7.3.3 The using declaration [namespace.udecl]
----1 A
using-declaration introduces a name into the declarative region in which the
using-declaration appears.
That name is a synonym for the name of some entity declared elsewhere.
----2 The member name specified in a
using-declaration is declared in the declarative region in which the
using-declarationappears. [Note: only the specified name is so declared; specifying an enumeration name in a
using-declaration does not declare its enumerators in the
using-declaration’s declarative region. ]
----3 Every
using-declaration is a
declaration and a
member-declaration and so can be used in a class definition.
Example:
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)};
Skipping forward a little from here, we have:
----15 The alias created by the
using-declaration has the usual accessibility for a
member-declaration.
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 inaccessiblepublic: using A::g; // B::g is a public synonym for A::g};
16 [Note: use of
access-declarations (11.3) is deprecated; member
using-declarations provide a better alternative.
Finally, referring to 11.3 to see what an "access declaration" is, it says:
11.3 Access declarations [class.access.dcl]
1---- The access of a member of a base class can be changed in the derived class by mentioning its
qualified-id in the derived class declaration. Such mention is called an
access declaration. The effect of an
access declaration is defined to be equivalent to the declaration
So, it appears that protection level modification is a feature of the using keyword.