Inaccessible operator == breaks child class with spaceship operator

Viewed 77

I bumped in GCC error, which can be demonstrated with the following simplified program. Base struct A has an operator == with some argument type other than A. Child struct B defines default spaceship operator <=>, which shall implicitly define operator == as well. But since no appropriate equality operator is found in the base class, B::operator == must be implicitly deleted. Instead, the resulting struct B appears broken in a way that no object of it can be created:

#include <compare>

struct A { 
    std::strong_ordering operator <=>(const A &) const = default;
    bool operator==(int) const;
};

struct B : A { 
    virtual std::strong_ordering operator <=>(const B &) const noexcept = default;
};

B b; //GCC error here

Demo: https://gcc.godbolt.org/z/584nhfxxs

Error message:

error: use of deleted function 'virtual constexpr bool B::operator==(const B&) const'
    9 |     virtual std::strong_ordering operator <=>(const B &) const noexcept = default;
      |                                  ^~~~~~~~
<source>:9:34: note: 'virtual constexpr bool B::operator==(const B&) const' is implicitly deleted because the default definition would be ill-formed:
<source>:8:8: error: no match for 'operator==' (operand types are 'A' and 'A')
    8 | struct B : A {
      |        ^
<source>:5:10: note: candidate: 'bool A::operator==(int) const' (reversed)
    5 |     bool operator==(int) const;
      |          ^~~~~~~~
<source>:5:21: note:   no known conversion for argument 1 from 'A' to 'int'
    5 |     bool operator==(int) const;
 

Is it simply a bug in GCC?

0 Answers
Related