Estou tentando definir operator<=>
uma classe, porém quando especifico uma implementação não padrão, std::three_way_comparable
retorna false
:
#include <cstdio>
#include <compare>
using namespace std;
struct UDTC
{
int i_;
UDTC(int i) : i_(i) {}
#if 1
friend std::strong_ordering operator<=>(const UDTC &lhs, const UDTC &rhs) {
return lhs.i_ <=> rhs.i_;
}
#else
friend std::strong_ordering operator<=>(const UDTC &lhs, const UDTC &rhs) = default;
#endif
};
int main(void)
{
if constexpr (std::three_way_comparable<UDTC>) {
fprintf(stderr, "UDTC is three_way_comparable\n");
} else {
fprintf(stderr, "UDTC is NOT three_way_comparable\n");
}
}
Quando executo isso com o Visual Studio 2022 ou GCC 12, se a <=>
função for padrão, three_way_comparable
retorna true
. Se eu fornecer minha própria implementação, ele retorna false
. Só posso supor que minha implementação esteja de alguma forma incompleta, mas não estou vendo o que estou perdendo.