【问题标题】:A friend function accessing a private member of a friend class访问朋友类的私有成员的朋友函数
【发布时间】:2021-08-16 20:49:15
【问题描述】:

关注the Czech song from Eurovision 2019 in Tel-Aviv

众所周知,在 C++ 中,朋友的朋友不是(自动)朋友。

但是,Clang 在以下代码上与 GCC 和 MSVC 不同:

class A {
public:    
    // forward declaration
    class Inner2;

private:
    class Inner1 {
        char foo;
        friend class Inner2;
    };
public:
    class Inner2 {
        Inner1 i;
    public:
        bool operator==(Inner2 other) {
            return i.foo == other.i.foo; // OK by GCC, Clang and MSVC++
        }
        friend bool operator!=(Inner2 a, Inner2 b) {
            return a.i.foo != b.i.foo; // Clang accepts, GCC and MSVC++ reject
        }
    };
};

代码:https://godbolt.org/z/rn48PTe1Y

哪一个是正确的? 如果 Clang 过于宽松是错误的,那么允许访问的最佳方式是什么(除了提供公共 getter 之外?)


注意:如果友元函数只是在类中声明并在外部实现,both Clang and GCC reject the code.

【问题讨论】:

  • clang 是错误的,因为它允许operator!=() - 不是Inner1 的朋友访问Inner1 的私人成员。一种正确提供访问的方法(它不依赖于所有编译器都有像clang那样的错误)是使operator!=()成为Inner2的成员而不是friend——因为Inner2是@ 987654332@ 已经存在,其成员将正确地访问Inner1 实例的成员。

标签: c++ friend friend-function friend-class


【解决方案1】:

好像是a known defect in clang, bug id #11515,早在2011年就报告过了,但显然还没有修复。

一个更简单的编译示例,但不应该编译(来自上面的错误报告):

class A {
  int n;
  friend struct B;
};

struct B {
  friend int get(A &a) {
    return a.n; // clang accepts, and should reject
  }
};

https://godbolt.org/z/r78Pazoqj

【讨论】:

    猜你喜欢
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    相关资源
    最近更新 更多