当某些结构D
两次继承另一个结构A
时:一次是私下通过B
,第二次是公开通过C
,是否允许使用B::AinD
?
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
使用B::A
必须只从D
公开注入的类名A
。一方面,A
已经可以在D
中使用(因此GCC接受它),但另一方面,A
在B
中是私有的(因此Clang拒绝它)。哪一个编译器在这里?
在这种情况下,它会以某种方式引起歧义。检查A
时需要忽略类查找。GCC应该是正确的,因为B::A
和C::A
引用了D
中相同的A
。如果添加了使用C::A的,即使clang也无法检测到错误
struct A {};
struct B : A {};
struct C : A {};
struct D : C, B {
using B::A; //ok in Clang, error in GCC
using C::A;
};
https://timsong-cpp.github.io/cppwp/namespace.udecl#1