在某些结构
D
继承另一个结构A
两次的情况下:一次通过B
私下,第二次通过C
公开,是否允许在using B::A
中写D
?
struct A {};
class B : A {};
struct C : A {};
struct D : B, C {
using B::A; //ok in GCC, error in Clang
};
程序被GCC接受,但是Clang打印错误:
error: 'A' is a private member of 'A'
演示:https://gcc.godbolt.org/z/5jeqrzorE
using B::A
必须暴露来自
A
的注入类名
D
。一方面,
A
已经可以在
D
中使用(因此 GCC 接受它),但另一方面,
A
在
B
中是私有的(因此 Clang 拒绝它)。哪一个编译器就在这里?
[class.access.base]/5:
对成员的访问受成员命名的类的影响。此命名类是在其范围名称查找中执行搜索以找到成员的类。本例中的命名类是
B
。由于
A
作为
B
的成员是私有的,它在
D
中不可访问,使得using-declaration 格式错误。