C++ 如果班外是我的朋友,班外也是我的朋友吗?
以下代码在MSVC上编译:C++ 如果班外是我的朋友,班外也是我的朋友吗?,c++,language-lawyer,friend,member-access,C++,Language Lawyer,Friend,Member Access,以下代码在MSVC上编译: #include <iostream> class Bob { int a; friend class Outer; }; class Outer { class Inner { void f(Bob obj) { std::cout << obj.a; //OK } }; }; #包括 班鲍勃 {
#include <iostream>
class Bob
{
int a;
friend class Outer;
};
class Outer
{
class Inner
{
void f(Bob obj)
{
std::cout << obj.a; //OK
}
};
};
#包括
班鲍勃
{
INTA;
朋友班外;
};
类外部
{
班级内部
{
无效f(Bob obj)
{
std::cout[class.access.nest]/1声明
嵌套类是成员,因此具有与任何其他成员相同的访问权限
所以我相信是的,这是标准行为
假设Outer
有一个成员函数foo()
。该函数当然可以访问Bob
的成员。据我所知,我引用的部分意味着Outer
中的任何嵌套类都具有与foo()相同的访问权限
,从而能够访问Bob的成员
还值得注意的是,该标准包含以下示例([class.friend]/2),请注意Y
中A::B
的用法:
class A {
class B { };
friend class X;
};
struct X : A::B {
// OK: A::B accessible to friend
A::B mx; // OK: A::B accessible to member of friend
class Y {
A::B my; // OK: A::B accessible to nested member of friend
};
};
似乎回答了这个问题。一个类的成员还可以访问该类已访问的所有名称@Jonas的可能副本:这个问题讨论了一个事实,即外部类的私有成员可以从内部访问,这一点我知道。这个问题非常不同,你不认为吗?我不这样认为。它表明sted类可以访问外部类可用的所有名称。这意味着嵌套类可以访问外部类是其朋友的类的成员,因为外部类可以访问这些名称。好的,请为我详细说明一下。我不明白这意味着如果外部是Bob的朋友,那么外部::内部也是如此