【发布时间】:2019-03-27 00:58:45
【问题描述】:
双向比较运算符应该是非成员函数,如果:
- 您希望第一个操作数的类型不是此类
- 您希望对两个操作数中的任何一个进行隐式类型转换
新的 C++20 三路比较运算符具有对称生成规则。表达式a@b 的名称查找,其中@ 是一个双向比较运算符,按照a@b、a<=>b 和b<=>a 的顺序完成(在选择时使用此优先顺序以防歧义)重载决议集中的最佳匹配)。有关详细信息,请参阅P0515R2。这意味着运算符<=> 可以是成员函数,但仍然允许第一个操作数不是此类类型。
但是,该论文包含以下注释:
通常,operator 应该只是一个成员函数;你仍然会 由于对称生成,获得每个参数的转换 §2.3 中的规则。在极少数情况下您也想支持 同时对两个参数进行转换(以启用比较 两个都不是这种类型的对象,但是使用这种类型的 比较功能),将其设为非会员好友。
如果我理解正确,它说只有在需要同时对两个操作数进行隐式转换时才需要非成员实现?那是对的吗?我可以在需要时查看一个实际示例吗?我正在考虑这个,尽管它似乎不是一个有效的例子:
struct foo
{
foo(int const x)
: data{ x } {}
foo(std::string_view x)
: data{std::stoi(x.data())}{}
friend auto operator<=>(foo const & lhv, foo const & rhv) noexcept
{
return lhv.data <=> rhv.data;
}
private:
int data;
};
int main()
{
assert(foo {42} == foo {"42"}); // OK
assert(42 == std::string_view("42")); // ??
}
【问题讨论】:
标签: c++ comparison-operators c++20 spaceship-operator