GCC可以从友元函数访问外部类的私有成员,MSVC不能?

xjreopfe  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(217)

这个builds在GCC中,但不是MSVC。GCC似乎可以从嵌套类中的友元函数访问外部类的私有成员,但MSVC不能。这是为什么呢?

template <typename T>
class Outer
{
public:
  struct Inner {
    friend bool operator==(const Inner& a, const Inner& b) {
      return a.outer_.private_member_ == b.outer_.private_member_;
    }
    // Both compilers are happy this if uncommented
//    bool operator==(const Inner& other) {
//      return outer_.private_member_ == other.outer_.private_member_;
//    }
   private:
    Outer<T>& outer_;
  };
  friend struct Iterator;

  private:
  int private_member_;
};

bool test(Outer<int>::Inner A, Outer<int>::Inner B)
{
    return A == B;
}

Demo

qco9c6ql

qco9c6ql1#

该程序是病态,根据class.nest#4,它声明:
与成员函数一样,在嵌套类中定义的友元函数([class.friend])也在该类的词法作用域中;它遵循与该类的静态成员函数([class.static])相同的名称绑定规则,但是它对封闭类的成员没有特殊的访问权限。
(强调我的)
这意味着不允许示例中的重载operator==访问封闭类Outer<T>的名为private_member_的私有数据成员。
要使其格式良好,可以将operator==(const Inner&, const Inner&)作为Outer<T>的友元。Demo
下面是gcc的bug:
GCC accepts private member access of enclosing class through friend function of inner class

相关问题