前一段时间,我定义了我的第一个三向比较运算符。它比较了单个类型并替换了多个常规运算符。很棒的功能。然后,我尝试实现一个类似的运算符,以通过委派比较两个变体:
auto operator <=> (const QVariant& l, const QVariant& r)
{
switch (l.type())
{
case QMetaType::Int:
return l.toInt() <=> r.toInt();
case QMetaType::Double:
return l.toDouble() <=> r.toDouble();
default:
throw;
}
}
这没有编译,我得到了错误inconsistent deduction for auto return type: ‘std::strong_ordering’ and then ‘std::partial_ordering’.
显然,
int
和double
spaceship 运算符(operator)返回不同的类型。解决此问题的正确方法是什么?
最佳答案
operator<=>
和int
的double
的类型不同,但是应该具有相同的类型。您可能想利用编译器自动查找正确的类型。您可以使用std::common_type
来执行此操作,但这将非常难看。仅在(在库中而不是在编译器中实现时)利用std::common_type
类型的作用并使用三元运算符会更容易:
auto operator <=> (const QVariant& l, const QVariant& r)
{
return l.type() == QMetaType:Int? l.toInt() <=> r.toInt()
: l.type() == QMetaType::Double? l.toDouble() <=> r.toDouble()
: throw;
}
关于c++ - 三向比较运算符的顺序推导不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65363107/