请看下面的代码
struct A { using type = int; };
struct B : private A {};
struct C : B { using base_type = A; };
所有 gcc 6.1、clang 3.8 和 msvc 2015 update 3 都拒绝编译它,因为A
它不是内部的可访问名称,C
因为A
它是B
. 似乎 gcc 认为A
inusing base_type = A
指的是A
. msvc 和 clang 似乎没有。
也许编译错误是由于继承触发的名称注入(因为修改using base_type = A
为using base_type = ::A
使所有编译器都能正常工作),但我想知道这个奇怪的错误是否是标准所说的。
更具体地说,
- 据我了解, not like
A::type
只是A
一个类名(尽管 gcc 将其误解为函数名),它被引入C
not insideA
norB
。为什么这个名字被认为是私有的B
? - 这个编译错误应该被认为是一个错误,还是标准规范的边缘情况?