gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:59:11 25 4
gpt4 key购买 nike

在 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 允许您定义它并获得完整的排序运算符( <<=>>= )。
没有理由在这里添加任意额外的灵活性。你为什么要实现 operator!=什么时候可以实现 operator== ?

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

关于c++ - 为什么 operator!= 从 operator== 合成,而不是相反?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63581288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com