簡體   English   中英

朋友訪問受保護的嵌套類

[英]Friend access to protected nested class

我有以下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,都沒有區別。 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家伙說

實際上,我還沒有實施過這條規則。 這或者是起草錯誤或是一個可怕的錯誤。 它是整個“受保護”的說明符,它使得代碼的良好構成依賴於完全不相關的類的存在,它在實現上施加了高成本,並且在模板的存在下它是正式不可判定的。

在C ++中,朋友不是傳遞性的。 朋友的朋友不一定是我的朋友。

通過在A中使Nested受保護,您指示所有子類都可以使用此元素,但是其他任何人都不允許使用它。 你可以認為這是一種朋友。 A使所有子類成為有關訪問嵌套結構的朋友。

現在B使C成為朋友,但這並不意味着C也是A的朋友。所以C應該無法訪問Nested。

但是:行為是從C ++ 03改變的。 在C ++ 03中,嵌套類是封閉類的完整成員,因此具有完全訪問權限。 友誼仍然不是傳遞性的,但現在成員訪問權限。

您可能需要查看http://www.rhinocerus.net/forum/language-c-moderated/578874-friend-transitive-nested-classes.html ,它解釋了類似的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM