如果类外是我的朋友,类外::内也是
If class Outer is my friend, is class Outer::Inner too?
以下代码在 MSVC 上编译:
#include <iostream>
class Bob
{
int a;
friend class Outer;
};
class Outer
{
class Inner
{
void f(Bob obj)
{
std::cout << obj.a; //OK
}
};
};
因此,如果Outside是Bob的朋友,那么Inner也是,自动。我正在阅读该标准的"朋友"章节,但找不到可以确认或反驳这一点的条款。
这是否合法,如果是,章节和经文是什么?
[class.access.nest]/1 指出
嵌套类是一个成员,因此具有与任何其他成员相同的访问权限
所以我相信是的,这是标准行为。
假设Outer
有一个成员函数foo()
。当然,该函数将可以访问Bob
的成员。据我了解,我引用的部分意味着Outer
内的任何嵌套类都将具有与foo()
相同的访问权限,因此具有访问Bob
成员的能力。
还值得注意的是,该标准包含以下示例([class.friend]/2(,请注意A::B
在Y
中的用法:
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
};
};
相关文章:
- 为什么即使我声明了朋友类,我也会收到错误"无法访问类中声明的私人成员"
- 在类内定义的友元函数与类外定义的友元函数的查找规则之间的差异
- C++单例模板类使我的程序崩溃
- 具有指向函数的指针的类内的结构是否需要类外函数的前向声明
- 有没有办法用单行逻辑代码打印金字塔星形图案?面试官向我的朋友问了这个问题
- 我应该使用类内发起器初始化静态常量数据成员还是在其类外的定义中初始化静态常量数据成员
- 我的朋友功能无法访问私人变量
- 如果类外是我的朋友,类外::内也是
- 为什么我的朋友操作超载代码将输出算出为零
- 如何在两个类之外的模板类内部的非模板类中声明的朋友函数定义
- C++如何将我的主类与我的头文件链接起来
- 对于在类外定义的友元函数,模板上的隐式转换查找失败
- 了解类外模板的类型
- 我的朋友无法在他的 linux 发行版上运行我的 openGL 程序
- 使用C++中类外定义的纯虚拟函数
- 当我试图从嵌套类访问外部类的成员数据时,为什么会出现分段错误
- 如何避免让我的GameManager类成为大多数东西的朋友
- 使用带有指针和文件的类概念 我的代码在第一种情况下不起作用,为什么?
- 我如何发送一个unix-exe给我的朋友,这样他就可以通过双击运行它
- 在课堂上和课堂外定义的朋友之间的区别:bug还是功能