在 C++ 中使用“using”公开私有基类名称

Fed*_*dor 11 c++ inheritance using private language-lawyer

D在某些结构两次继承另一个结构的情况下A:一次是私有的 via B,第二次是公开的 via 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
};
Run Code Online (Sandbox Code Playgroud)

该程序被 GCC 接受,但 Clang 打印错误:

error: 'A' is a private member of 'A'
Run Code Online (Sandbox Code Playgroud)

演示: https: //gcc.godbolt.org/z/5jeqrzorE

using B::A必须只暴露注入的类AD。一方面,A它已经可以在 in 中使用D(因此 GCC 接受它),但另一方面它A是私有的B(因此 Clang 拒绝它)。这里是哪一个编译器?

小智 -1

在这种情况下,它会以某种方式引起歧义。检查时需要忽略类查找A。GCC 应该是正确的,因为B::AC::A引用相同的Afrom Dusing 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;
};
Run Code Online (Sandbox Code Playgroud)

https://timsong-cpp.github.io/cppwp/namespace.udecl#1