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 == y为not (x != y)- 这对我来说似乎天生很奇怪,因为“不等于”的名称是......不是“等于”,但您可以这样做。但是你绝对不想x <=> y用x < yor来定义x <= y。这将是一个昂贵的转换,甚至无法正确确定比较类别。因此,这样的方向会打破我们现有的与排序的对称性,使语言规则更难理解。
| 归档时间: |
|
| 查看次数: |
185 次 |
| 最近记录: |