please see the following code
struct A { using type = int; };
struct B : private A {};
struct C : B { using base_type = A; };
All of gcc 6.1, clang 3.8, and msvc 2015 update 3 refuse to compile this, as A
is not an accessible name inside C
since A
is a private base of B
. It seems that gcc thinks A
in using base_type = A
refers to the default constructor of A
. msvc and clang seem not.
Perhaps the compilation error is due to the injection of names triggered by inheritances (because modifying using base_type = A
into using base_type = ::A
make all the compilers work fine), but I want to know if this weird error is what the standard says.
More concretely,
- As I understood, not like
A::type
,A
is just a class name (although gcc misinterprets it as a function name) which is introduced toC
not insideA
norB
. Why this name is considered private toB
? - Should this compilation error be considered a bug, or is an edge case of the specifications of the standard?