2013-07-17 116 views
5

我一直在讀this article的私有成員,並與memberspace成語一會兒玩弄時,我注意到的東西,這個片段(其中編譯沒有問題:http://ideone.com/hRiV5B):內出乎我的意料Memberspaces可以訪問父類

class HugeClass 
{ 
    public: 
     struct memberspace 
     { 
      int f() const { return parent.f; } 

      private: 
       friend HugeClass; 
       explicit memberspace(HugeClass & parent) 
       : parent(parent) {} 
       HugeClass & parent; 
     } memberspace; 

     HugeClass() : memberspace(*this), f(42) {} 

    private: 
     int f; 
}; 

我本來會期待一個編譯器錯誤,即HugeClass::f的訪問是不允許的,因爲f在該上下文中是私有的。

HugeClassmemberspace一個friend,所以HugeClass可以調用memberspace私人構造,但爲什麼它周圍工作的其他方式沒有明確聲明memberspaceHugeClass一個friend

+0

成員空間被認爲是HugeClass的一部分,因此具有完全訪問權限。 –

回答

6

通過C++ 11中的語言規則。

嵌套類是一個成員,因此具有與任何其他成員相同的訪問權限。 實施例:

class E { 
    int x; 
    class B { }; 
    class I { 
    B b; // OK: E::I can access E::B 
    void f(E* p, int i) 
    { 
     p->x = i; // OK: E::I can access E::x 
    } 
    }; 
}; 

而在C++ 03是

嵌套類的成員具有一種封閉類的成員沒有特殊的訪問,也不類或與封閉課程授予友誼的功能;通常的訪問規則(第11條)應遵守 。

因此,來自C++ 11的示例不應該適用於C++ 03編譯器。

+4

請注意,這只是自2011年以來的正式情況。舊標準說相反(「嵌套類的成員沒有特殊訪問封閉類的成員」),雖然一些流行的編譯器一直遵循許多新規則年份。 –

+0

@MikeSeymour謝謝。這也是在發佈答案之前閱讀C++ 03標準的原因。 – ForEveR

+1

這非常有趣。在尋找更多關於此的信息時,我發現了語言缺陷報告:http://www.open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#45從該文檔中,實際上我認爲它是有效的在C++ 03中(不僅僅是C++ 11),因爲原來的行爲被認爲是一種語言缺陷 – nijansen

1

memberspaceHugeClass的一部分,與其他類的成員具有相同的訪問權限。