类成员中内联函数的前向声明导致链接器错误

MC *_* ΔT 5 c++ language-lawyer

考虑以下代码:

struct Foo {
    float f;
    
    Foo& operator+=(Foo rhs) {
        Foo operator+(Foo, Foo);
        *this = *this + rhs;
        return *this;
    }
};

inline Foo operator+(Foo lhs, Foo rhs) {
    return Foo{lhs.f + rhs.f};
}
Run Code Online (Sandbox Code Playgroud)

当且仅当operator+(Foo, Foo)定义为 时inline,GCC 和 MSVC 会给出“未定义对 operator+(Foo, Foo) 的引用”链接器错误,而 Clang 没有问题。请参阅此处以获取实时示例。

我认为这段代码是有效的;inline函数的-ness 应该没有任何影响,因为函数不需要像inline定义为那样声明inline(无论如何,函数不能inline在块范围内声明)。
请注意,如果在 的定义之前operator+(Foo, Foo)改为声明(为非inlineFoo,则所有 3 个编译器都接受它。

但是,标准中的诸如链接之类的问题很棘手,所以我知道它也可能是未定义的行为或“格式错误,无需诊断”,而 GCC 和 MSVC 恰好会出错。

那么这个代码有效吗?哪个编译器是正确的?