对受保护嵌套类的友元访问

2023-11-25

我有以下 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
  }
};

使用 g++ 4.4 编译此代码片段,无论我在 m1 中使用 B::Nested 还是 A::Nested 都没有什么区别。铿锵接受B::Nested,但如果我不编译A::Nested。这是 g++ 或 clang 中的错误吗?


根据标准,GCC 是正确的,而 Clang 是错误的。上面写着 11.2/4

当在类 N 中命名时,成员 m 是可访问的,如果

  • m 作为 N 的成员受到保护,并且引用发生在 N 类的成员或友元中,或者发生在从 N 派生的类 P 的成员或友元中,其中 m 作为 P 的成员是私有的或受保护的

这是此 Clang 错误报告的主题,它阻止 Clang 构建 Qt:http://llvm.org/bugs/show_bug.cgi?id=6840。一位 Clang 人说

事实上,我还故意没有执行这个规则。它是一个 起草错误或可怕的错误。它使整个“受保护”变得中性 说明符,它使代码的格式良好依赖于 完全不相关的类的存在,会给 实现,并且在模板存在的情况下它在形式上是不可判定的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对受保护嵌套类的友元访问 的相关文章

随机推荐