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

时间:2014-02-10 23:07:08

标签: c++ gcc c++11

我今天进行了一些讨论,是否有必要明确声明内部friend / class的{​​{1}}访问权限。这是有问题的(复制样本)代码:

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; } 类中使用friend struct InterfaceImpl;来使其正常工作。因此,以下设置都可以正常运行:c++11GCC 4.8.1GCC 4.3.2

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

1 个答案:

答案 0 :(得分:8)

他们本身不是friend s (所以你的解释是巧妙的错误),但是你看到的效果肯定是标准规定的:

  

[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措辞正在赶上一个长期存在的实际现实。