提问者:小点点

在C中使用`using`公开私有基类名称


当某些结构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接受它),但另一方面,AB中是私有的(因此Clang拒绝它)。哪一个编译器在这里?


共1个答案

匿名用户

在这种情况下,它会以某种方式引起歧义。检查A时需要忽略类查找。GCC应该是正确的,因为B::AC::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