10

テルアビブで開催されたユーロビジョン 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 の両方がコードを拒否します

4

1 に答える 1