嵌套的结构体/类声明会自动成为外部类的友元吗?

3
今天我来讨论一下,是否需要明确声明内部的类/结构体的friend访问权限。这是相关的(复制的样例)代码:
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

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


因为你坚决要求重新打开自己的问题,所以我投票支持保持关闭状态。 - undefined
@πάνταῥεῖ 我不太确定这与重复问题有何不同...你介意告诉我吗? - undefined
我要求重新打开这个问题,因为(与重复问题相比)它很好地整合了所有标准关注点(并提到了GCC的异常[我一直在标记!!] )!它主要区别于给定的标签(相关性),以及解释了GCC 4.3.2行为的异常行为之间的关系。 - undefined
你可以从这里阅读所有的回答(不知何故)来自提出的重复问题中,但根据给定标签的相关性,这个特定的问答可能要么独立存在,要么超过推荐的重复问题。 - undefined
1个回答

8

他们并不是“朋友”(因此您的解释略有错误),但您看到的效果肯定是标准规定的:

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

这个标准中给出的示例与您的类似。

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

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

早在1998年就被认为是标准中的一个缺陷(并在2001年成为DR#45), 这可能解释了为什么您在GCC中看到了不符合规范的行为,而这也可以解释为什么我们可以将新的C++11措辞视为追赶长期存在的实际现实。


@πάνταῥεῖ:如果这能让你感觉好一点,我也得查一下。:) - undefined
嗯,还有那个GCC 4.3.2的示例(它并不真正保证符合C++11标准)。这是其中一种无处不在的GCC扩展吗? - undefined
3
值得一提的是,在C++11之前,这并不是官方规定的情况。(我一直以为它是这样的,因为GCC多年来都是这样工作的,所以很惊讶发现它不是。) - undefined
@MikeSeymour 说得好,因为我认为给定的代码(包括friend声明)也应该在非GCC兼容的C++编译器中进行编译(可能是一些“嵌入式”糟糕的东西...)。就目前而言,参考C++11标准是唯一真正可靠的事情。 - undefined
1
@LightnessRacesinOrbit 这使得它再次成为一个可接受的有效答案!(抱歉我这么懒,又是这样;)) - undefined
显示剩余13条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接