我今天进行了一些讨论,是否有必要明确声明内部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++11,GCC 4.8.1,GCC 4.3.2。
答案 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措辞正在赶上一个长期存在的实际现实。