2

次のコードは、コンパイラによって異なる方法で処理されます。

#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;
};

GCC と MSVC の両方がそれを受け入れますが、エラーを返す 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

I::operator <=>(const I&) const定義されていないため、A::operator <=>(const A&) const暗黙的に削除する必要があり、削除されたメソッドは から削除されていないメソッドをオーバーライドすることはできませんI。他のコンパイラもコードを受け入れる権利を持っていますか?

4

1 に答える 1