我有以下C++代码:
class A {
protected:
struct Nested {
int x;
};
};
class B: public A {
friend class C;
};
class C {
void m1() {
B::Nested n; // or A::Nested
}
};
Run Code Online (Sandbox Code Playgroud)
使用g ++ 4.4编译这个片段,无论我在m1中使用B :: Nested还是A :: Nested,都没有区别.Clang接受B::Nested,但如果我不编译A::Nested.这是g ++或clang中的错误吗?
根据该标准,GCC是正确的,Clang是错的.它在11.2/4说
在N类中命名时,可以访问成员m
- 作为N的成员的m受到保护,并且引用发生在N类的成员或朋友中,或者在从N派生的类P的成员或朋友中,其中作为P的成员的m是私有的或受保护的
这是这个Clang bugreport的主题,它阻止了Clang构建Qt:http://llvm.org/bugs/show_bug.cgi?id = 6840.一个Clang家伙说
实际上,我还没有实施过这条规则.这或者是起草错误或是一个可怕的错误.它是整个"受保护"的说明符,它使得代码的良好构成依赖于完全不相关的类的存在,它在实现上施加了高成本,并且在模板的存在下它是正式不可判定的.