在C ++中,嵌套类具有对封闭类的所有成员的访问权限。这是否也适用于嵌套类的嵌套类?
此代码
#include <iostream>
class A
{
public:
class B
{
public:
B() { std::cout << A::x << std::endl; }
class C
{
public:
C() { std::cout << A::x << std::endl; }
};
};
private:
static const int x { 0 };
};
int main()
{
A::B b;
A::B::C c;
}
在g ++ 7.2上编译时没有警告。但是,我不清楚这是否符合标准。标准草案(N4727 14.7)说:
嵌套类是成员,因此具有与任何其他成员相同的访问权限。
但是,在上面的示例中,C
不是A
的成员,它是成员的成员。这里的标准模棱两可吗? g ++行为是否可移植?
答案 0 :(得分:5)
但是,在上面的示例中,
C
不是A
的成员,它是成员的成员。
是的,这是明确定义的行为;访问权限从B
转移。
根据标准[class.access]/2,
类的成员也可以访问该类可以访问的所有名称。
类的成员是数据成员,成员函数,嵌套类型,枚举数以及成员模板和特化。
C
是B
的嵌套类,它也是B
的成员,然后C
可以访问B
可能的名称访问权限,包括A::x
。出于同样的原因,C::C
是C
的成员,它可以访问C
可以访问的名称,因此访问A::x
中的C::C
很好。
答案 1 :(得分:2)
行为定义明确,符合标准措辞。你遗漏的是[class.access]p2
的相关措辞,它强化了你已经引用过的内容:
类的成员也可以访问该类具有的所有名称 访问。成员函数的本地类可以访问与该函数相同的名称 成员函数本身可以访问。
这意味着可访问性是可传递的。如果C
可以访问与B
相同的实体,则表示C
可以访问A
中的实体,因为B
可以访问这些实体
class A {
class B {
class C {
C() { A::x; /* well-defined */ }
};
};
static int x;
};