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

πάν*_*ῥεῖ 2 c++ gcc c++11

我今天进行了一些讨论,是否有必要明确声明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() {}
};
Run Code Online (Sandbox Code Playgroud)
int main() {
    Implementation impl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我一直注意到代码编译得很好,我认为有必要friend struct InterfaceImpl;Implementation课堂上让它运行起来.所以以下设置都可以正常工作:c ++ 11,GCC 4.8.1,GCC 4.3.2.

是否有 (pre- )标准部分确认这是合法的?

Lig*_*ica 8

他们不是friend小号本身(所以你的解释是错误的巧妙),但你已经看到了效果,绝对是标准规定:

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

此标准中给出的示例与您的类似.

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

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

早在1998年就被认为是标准中的一个缺陷(并在2001年被制作成DR#45),这可能在某种程度上解释了为什么你在GCC中看到不合规的行为,前C++ 11 .从这个意义上讲,我们可能会看到新的C++ 11措辞正在赶上一个长期存在的实际现实.

  • 值得一提的是,在C++ 11之前,情况并非如此.(我一直以为是,因为那是GCC多年来的工作方式,而且很惊讶发现它不是.) (3认同)