C++ 内部结构/类声明是否自动成为嵌套类的朋友?

C++ 内部结构/类声明是否自动成为嵌套类的朋友?,c++,c++11,gcc,C++,C++11,Gcc,今天我讨论了一下,是否有必要明确声明对内部类的/结构的访问权限。下面是有问题的(复制示例)代码: struct Interface { virtual void foo() = 0; virtual ~Interface() {} }; class Implementation { struct InterfaceImpl : Interface { InterfaceImpl(Implementation* impl) : im

今天我讨论了一下,是否有必要明确声明对内部
类的
/
结构的
访问权限。下面是有问题的(复制示例)代码:

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() {}
};
我注意到代码编译得很好,我认为有必要使用
friend struct InterfaceImpl实现
类中执行code>以使其正常工作。因此,以下设置都可以正常工作:


是否有一个(预)标准部分确认这是合法的?

他们本身并不是
朋友(因此你的解释有细微的错误),但你所看到的效果肯定是标准强制的:

[C++11:11.7/1]:
嵌套类是成员,因此具有与任何其他成员相同的访问权限。[……]

本标准此时给出的示例与您的示例类似

然而,这在C++03中是不合法的

[C++03:11.8/1]:
嵌套类的成员对封闭类的成员没有特殊访问权,也对授予封闭类友谊的类或函数没有特殊访问权;应遵守通常的访问规则(第11条)。[……]


,这可能在某种程度上解释了为什么在GCC,即C++11之前的版本中会出现不合规行为。从这个意义上讲,我们可能会认为新的C++11措辞赶上了长期存在的实际情况。

THX!这就解释了!这就是我的一位同事直觉上认为的,马上!是时候到处删除这些不必要的
friend
声明了;-)(而且这些都没有伤害任何东西)@πάνταῥεῖ: 如果这能让你感觉好一点的话,我还是得查一下啊!!我现在太懒了(真可耻),让我现在感觉更糟;-)。。。也许值得一提的是,在C++11之前,官方并没有这样做。(我一直认为是这样,因为GCC多年来就是这样工作的,我很惊讶地发现事实并非如此。)@LightnessRacesinOrbit再次将其作为有效答案来接受!(对不起,我又那么懒了;))投票决定关门,特别是因为你要求重新打开你自己的问题。@πάνταῥεῖ 我不太清楚这和被骗有什么不同。。。你介意告诉我吗?我要求重新打开这个问题,因为(相对于dupe)它很好地整合了所有的标准关注点(并提到了GCC例外[我一直在标记!!])!它主要不同于给定的标记(相关性),以及解释GCC 4.3.2行为的异常行为的关系。你可以(不知何故)从建议的dupe中的丛林中阅读所有这些问题的答案,但根据给定标记的相关性,这个特定的Q/A可能独立存在,或者超过建议的dupe。
int main() {
    Implementation impl;

    return 0;
}