以下代码在编译器中受到不同的处理:
#include <compare>
struct A;
struct I {
virtual std::strong_ordering operator <=>(const A&) const {
return std::strong_ordering::equal;
}
};
struct A : I {
virtual std::strong_ordering operator <=>(const A&) const = default;
};
GNU 编译器和 Microsoft Visual C++ 都支持此语法,但 Clang 不支持并会返回错误:
warning: explicitly defaulted three-way comparison operator is implicitly deleted [-Wdefaulted-function-deleted]
virtual std::strong_ordering operator <=>(const A&) const = default;
defaulted 'operator<=>' is implicitly deleted because there is no viable three-way comparison function for base class 'I'
error: deleted function 'operator<=>' cannot override a non-deleted function
virtual std::strong_ordering operator <=>(const A&) const = default;
演示:https://gcc.godbolt.org/z/WGrGTe89z
看起来只有 Clang 正确。因为 I::operator <=>(const I&) const
没有被定义,所以 A::operator <=>(const A&) const
必须被隐式删除,而一个被删除的方法无法覆盖 I
中未被删除的方法。其他编译器接受这段代码也是正确的吗?