如果我在C++中定义了一个内部类,它会自动成为包含它的类的友元吗?例如,这是否法律的:
class Outer {
public:
class Inner {
public:
void mutateOuter(Outer& o);
};
private:
int value;
};
void Outer::Inner::mutateOuter(Outer& o) {
o.value ++; // Legal? Or not?
}
我这样问是因为在我试过的一些编译器(VS2003)上,这段代码不能工作,但我听说它在一些编译器上可以工作。我在C++规范中找不到相关的章节,如果有人能引用一些具体的东西来说明它是合法的还是不法律的的,那就太好了。
5条答案
按热度按时间2ul0zpep1#
在我自己问过或多或少相同的问题here之后,我想分享(显然)C++11的更新答案:
引用自https://stackoverflow.com/a/14759027/1984137:
标准$11.7.1
“嵌套类是一个成员,因此具有与任何其他成员相同的访问权限。封闭类的成员对嵌套类的成员没有特殊的访问权限;应遵守通常的访问规则”
并且通常的访问规则规定:
“类的成员也可以访问该类有权访问的所有名称...”
标准中给出了具体的例子:
wmomyfyw2#
直到C11(即C98和C++03):不知道
在C98和C03中,嵌套类默认不能访问封闭类的
private
和protected
成员。C++ Standard(2003)在$11.8/1 [class.access.nest]中说:
嵌套类的成员对封闭类的成员没有特殊的访问权限,也不能访问已将友谊授予封闭类的类或函数;应遵守通常的访问规则(第11条)。**封闭类的成员对嵌套类的成员没有特殊的访问权限;**应遵守通常的访问规则(第11条)。
标准本身的例子:
C++11起:是的
上述限制自C++11起已被删除。现在嵌套类可以访问封闭类的
private
和protected
成员:希望能帮上忙。
r7xajy2e3#
该标准似乎改变了关于可访问性的规范。
C98中的§11.8/1规定:
嵌套类的成员对封闭类的成员没有特殊的访问权限,也不能访问已将友谊授予封闭类的类或函数;应遵守通常的访问规则。
N1804中的§11.8/1(TR 1之后)规定:
嵌套类是一个成员,因此具有与任何其他成员相同的访问权限。
我认为当前的C编译器遵循较新的规范。
izj3ouym4#
**此答案与(过时的)C++03规范有关。**此问题的公认答案更符合最新情况。
好吧,我觉得现在问这个问题很愚蠢,因为我刚刚找到了规范中涵盖这一点的相关部分:§11.8/1:
**嵌套类的成员对封闭类的成员没有特殊的访问权限,也不能访问已将友谊授予封闭类的类或函数;应遵守通常的访问规则(第11条)。**封闭类的成员对嵌套类的成员没有特殊的访问权限;应遵守通常的访问规则(第11条)
(My强调)
所以看起来不,内部类没有特殊的访问特权。
ftf50wuq5#
我不知道确切的位置,但我确实记得阅读了规范,发现类中的任何私有数据对所有其他类都是隐藏的,包括嵌套类。
基本上,嵌套一个类定义了一个特定的范围,而不是访问特权。