我今天进行了一些讨论,是否有必要明确声明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.
他们不是friend小号本身(所以你的解释是错误的巧妙),但你已经看到了效果,绝对是标准规定:
[C++11: 11.7/1]:嵌套类是成员,因此具有与任何其他成员相同的访问权限.[..]
此标准中给出的示例与您的类似.
但是,这在C++ 03中不合法!
[C++03: 11.8/1]:嵌套类的成员对封闭类的成员没有特殊访问权限,也没有对已经为封闭类授予友谊的类或函数的特殊访问权限.应遵守通常的准入规则(第11条).[..]
早在1998年就被认为是标准中的一个缺陷(并在2001年被制作成DR#45),这可能在某种程度上解释了为什么你在GCC中看到不合规的行为,前C++ 11 .从这个意义上讲,我们可能会看到新的C++ 11措辞正在赶上一个长期存在的实际现实.
| 归档时间: |
|
| 查看次数: |
216 次 |
| 最近记录: |