这段代码在 MSVC 上编译通过,但在 GCC 上不行,在 GodBolt.org 测试时出现该问题。
Baz 类在匿名命名空间中声明,这会导致 GCC 认为它是一个与下面我定义的不同的类,而 MSVC 似乎将它们连接起来了。
namespace { class Baz; }
class Foo { protected: int x; };
class Bar : public Foo { friend class Baz; };
namespace {
class Baz { void f() { Bar b; b.x = 42; } };
}
按照标准来说,什么是正确的呢?
class Bar { friend class Baz; protected: int x; };
。我仍然可以用它来复现 - 在 msvc 和 clang 中编译通过,但在 gcc 中不行。 - Kevin