【发布时间】: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