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
必须只暴露注入的类A
名D
。一方面,A
它已经可以在 in 中使用D
(因此 GCC 接受它),但另一方面它A
是私有的B
(因此 Clang 拒绝它)。这里是哪一个编译器?
小智 -1
在这种情况下,它会以某种方式引起歧义。检查时需要忽略类查找A
。GCC 应该是正确的,因为B::A
并C::A
引用相同的A
from D
。using 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
归档时间: |
|
查看次数: |
338 次 |
最近记录: |