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

问题描述 投票:0回答:2

在某些结构

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 拒绝它)。哪一个编译器就在这里?

c++ inheritance language-lawyer private using
2个回答
1
投票

[class.access.base]/5:

对成员的访问受成员命名的类的影响。此命名类是在其范围名称查找中执行搜索以找到成员的类。

本例中的命名类是

B

。由于 
A
 作为 
B
 的成员是私有的,它在 
D
 中不可访问,使得 
using-declaration 格式错误。


-1
投票
在这种情况下,它会以某种方式引起歧义。检查

A

时需要忽略类查找。 GCC 应该是正确的,因为 
B::A
C::A
 指的是来自 
A
 的相同 
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; };

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

© www.soinside.com 2019 - 2024. All rights reserved.