2014-02-10 33 views
2

今天我已經過了一些討論,無論是否需要明確聲明friend訪問內部class/struct。這裏是(複製樣本)代碼的問題:內部結構/類聲明是否自動成爲嵌套類的朋友?

struct Interface 
{ 
    virtual void foo() = 0; 
    virtual ~Interface() {} 
}; 

class Implementation 
{ 
    struct InterfaceImpl : Interface 
    { 
     InterfaceImpl(Implementation* impl) 
     : impl_(impl) {} 
     virtual void foo() 
     { 
      impl_->doFoo(); // << Here's what's in question!! 
     } 

     Implementation* impl_; 
    }; 

public: 
    Implementation() 
    : interfaceImpl_(this) {} 

    Interface* getInterface() { return &interfaceImpl_; } 

private: 
    InterfaceImpl interfaceImpl_; 

    void doFoo() {} 
}; 

int main() { 
    Implementation impl; 

    return 0; 
} 

我已經注意到,該代碼編譯好了,在這裏我想這將是必要的Implementation類有friend struct InterfaceImpl;讓它工作。所以下面的設置都可以正常工作:c++11,GCC 4.8.1,GCC 4.3.2

是否有)標準部分確認這是合法的?

+0

投票停止專門因爲你**要求**重新打開你自己的問題。 – chrylis

+0

@πάνταῥεῖ我不太確定這是如何不同於愚蠢的......你會介意告訴我嗎? – hichris123

+0

我要求重新開放這個問題,因爲(對付這個問題)它鞏固了所有的標準問題(並且提到了GCC的例外[我一直在標註!!])很好!它主要與給定的標籤(相關性)不同,並且它的關係解釋了GCC 4.3.2行爲的特殊行爲。 –

回答

8

他們不是friend小號本身(所以你的解釋是錯誤的巧妙),但你已經看到了效果,絕對是標準規定:

[C++11: 11.7/1]:嵌套類是一個成員,因爲它具有與任何其他成員相同的訪問權限。 [..]

此處給出的示例中的示例與您的示例類似。

但是,這在C++ 03中是不合法的!

[C++03: 11.8/1]:嵌套類的成員具有一種封閉類的成員沒有特殊的訪問,也不類或已授予的友誼的封閉類的功能;應遵守通常的訪問規則(第11條)。 [..]

This was considered to be a defect in the standard as early as 1998 (and made into DR #45 in 2001),這可能在一定程度上解釋了爲什麼你在GCC看到不合規的行爲,預C++ 11。從這個意義上說,我們可能會看到新的C++ 11措辭正趕上了長期存在的實際情況。

+0

THX!這解釋了它!那就是,我的其他同事直覺地假設了一下,馬上! **時間**去除這些不必要的「朋友」聲明;-)(也是這些都沒有傷害任何東西)... –

+0

@πάνταῥεῖ:如果它讓你感覺更好,我不得不看無論如何。 :) –

+0

Awww !!我現在太懶惰了(**對我來說是羞恥),現在讓我感覺更糟糕;-) ... –