为什么 operator!= 从 operator== 合成,而不是相反?

cig*_*ien 6 c++ comparison-operators language-lawyer c++20

在 c++20 中,如果我提供一个operator==for 类型,那么编译器会合成一个operator!=,但反之则不然。

这是一些代码

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?
}
Run Code Online (Sandbox Code Playgroud)

这似乎不一致,因为!===必须是相反的,如果一个可以从另一个合成,那么逆也应该起作用。这是什么原因?

Bar*_*rry 10

因为这增加了语言的复杂性而没有任何好处。

主要操作是平等。C++20 让您只需定义operator==即可获得等式运算(==!=)的完整补充。同样地,主排序操作<=>和C ++ 20允许你只定义,并得到运营商订购了全套(<<=>>=)。

没有理由在这里添加任意额外的灵活性。为什么你会刚刚实施operator!=时,你可以实现operator==


从理解规则和构建功能的角度来看,该语言目前在==和之间具有很好的对称性<=>,我认为这是有价值和重要的。虽然您可以定义x == ynot (x != y)- 这对我来说似乎天生很奇怪,因为“不等于”的名称是......不是“等于”,但您可以这样做。但是你绝对不想x <=> yx < yor来定义x <= y。这将是一个昂贵的转换,甚至无法正确确定比较类别。因此,这样的方向会打破我们现有的与排序的对称性,使语言规则更难理解。

  • @cigien 使所有程序通过仅实现“==”而不是某些程序用“!=”实现运算符来实现运算符的一致性是一个好处。 (4认同)