这是 g++ 或 clang++ 中的错误

Grz*_*ski 4 c++ g++ clang++

以下代码:

class A
{
  friend class B;
  int m;
};

class B
{
  friend void f(A* p) { p->m = 32; }
};
Run Code Online (Sandbox Code Playgroud)

在 clang 版本 9.0.0-2 中编译,但不在 g++ 版本 9.2.1 中编译

friend-test.cpp: In function ‘void f(A*)’:
friend-test.cpp:10:28: error: ‘int A::m’ is private within this context
   10 |   friend void f(A* p) { p->m = 32; }
      |                            ^
friend-test.cpp:5:7: note: declared private here
    5 |   int m;
      |       ^
Run Code Online (Sandbox Code Playgroud)

哪个编译器是对的?

Sto*_*ica 8

海湾合作委员会在右边。Clang 似乎有一个错误。

[班级.朋友]

10友谊既不是继承的,也不是传递的。[?例子:

class A {
  friend class B;
  int a;
};

class B {
  friend class C;
};

class C  {
  void f(A* p) {
    p->a++;         // error: C is not a friend of A despite being a friend of a friend
  }
};

class D : public B  {
  void f(A* p) {
    p->a++;         // error: D is not a friend of A despite being derived from a friend
  }
};
Run Code Online (Sandbox Code Playgroud)

?—?结束示例?]

事实f是朋友B和B又一个朋友A,并不意味着f允许访问A的私处。