为什么在 C++ 20 中从标准库容器中删除了比较运算符?

Gau*_*ant 11 c++ spaceship-operator c++20

我在浏览cppreference 时看到vectorC++20 中删除了它的比较操作,并<=>引入了飞船运算符 ( )。对于许多其他标准库容器,如set和 ,可以看到同样的事情map

如何在新标准中进行比较?另外,C++20 会开始在旧代码上出错吗?

Som*_*ude 19

如果您继续在参考站点上浏览一点,您可能会来到默认比较部分,它只是说明:

简言之,它定义一类operator<=>自动获取编译器生成的运营商<<=>,和>=

因此,如果某个类存在“太空船”运算符,编译器将使用运算符的结果自动生成剩余的比较运算符<=>

请注意,不会生成==运算符(即使它应该是可能的),但会保持.std::vectoroperator==


至于:

C++ 20 会开始在旧代码上出错吗?

不,不会。

当建立与一个C ++编译器20,与它应该使用标准库可用于C ++ 20制成,从而实现<=>操作者,如上文所解释的,这将随后被使用。

但是,如果您使用 C++20 编译器来构建较旧的标准库,则该较旧的标准库仍将实现较旧的比较运算符。

  • 请注意,从技术上讲,这是一个小的兼容性破坏。如果您过去直接调用“operator&lt;”,则会出现编译错误。但实际上,你不应该这样做。 (3认同)