テルアビブで開催されたユーロビジョン 2019のチェコの歌に続いて
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 が寛大すぎるために間違っている場合、アクセスを許可する最善の方法は何ですか (公開ゲッターを提供する以外に?)
注: フレンド関数がクラスで宣言され、外部で実装されている場合、Clang と GCC の両方がコードを拒否します。