朋友访问受保护的嵌套类

Tor*_*rek 11 c++ friend

我有以下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中的错误吗?

Joh*_*itb 8

根据该标准,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家伙说

实际上,我还没有实施过这条规则.这或者是起草错误或是一个可怕的错误.它是整个"受保护"的说明符,它使得代码的良好构成依赖于完全不相关的类的存在,它在实现上施加了高成本,并且在模板的存在下它是正式不可判定的.