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;
}