如何解决为什么operator!=是从operator ==合成的,而不是相反的?
在c ++ 20中,如果我为类型提供了operator==
,则编译器会合成一个operator!=
,但反之则不然。
这里有一些code:
struct A {};
bool operator==(A const&,A const&);
struct B {};
bool operator!=(B const&,B const&);
int main()
{
if (A{} != A{}) {} // error in c++17
// ok in c++20
if (B{} == B{}) {} // error in c++17
// error in c++20,why?
}
这似乎不一致,因为要求!=
和==
是相反的,并且如果一个可以彼此合成,则反函数也应该起作用。是什么原因呢?
解决方法
因为这增加了语言的复杂性,但毫无益处。
主要操作是相等性。 C ++ 20允许您仅定义operator==
以获得完全相等的相等运算(==
和!=
)。同样,主要的排序操作是<=>
,而C ++ 20允许您对其进行定义并获得排序操作符({{1},<
,<=
和>
。
这里没有理由添加任意的额外灵活性。为什么可以实现实现>=
,而又实现呢?
从了解规则和构建功能的角度来看,该语言目前在operator!=
和operator==
之间具有很好的对称性,我认为这是有价值且重要的。当您可以将==
定义为<=>
时,这对我来说似乎很奇怪,因为“不等于”的名称不是...等于“等于”,但是您可以去做。但是您绝对不希望根据x == y
或not (x != y)
来定义x <=> y
。那将是一个昂贵的转换,甚至无法正确确定比较类别。因此,这样的方向会破坏我们具有的顺序的对称性,使语言规则更难以理解。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。