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)
改为声明(为非inline
)Foo
,则所有 3 个编译器都接受它。
但是,标准中的诸如链接之类的问题很棘手,所以我知道它也可能是未定义的行为或“格式错误,无需诊断”,而 GCC 和 MSVC 恰好会出错。
那么这个代码有效吗?哪个编译器是正确的?