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

Posted

技术标签:

【中文标题】为啥在 C++ 20 中从标准库容器中删除了比较运算符?【英文标题】:Why have comparison operators been removed from standard library containers in C++ 20?为什么在 C++ 20 中从标准库容器中删除了比较运算符? 【发布时间】:2020-07-14 20:55:39 【问题描述】:

我在浏览cppreference,看到vector的比较操作在C++20中被去掉了,并且引入了宇宙飞船操作符(<=>)。在setmap 等许多其他标准库容器中也可以看到同样的情况。

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

【问题讨论】:

【参考方案1】:

如果您继续浏览参考网站一点,您可能会来到default comparisons 上的部分,它简单地说:

简而言之,定义operator<=> 的类会自动获取编译器生成的运算符<<=>>=

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

请注意,== 运算符是生成的(即使它应该是可能的),但std::vector 保持operator== 的重载。


至于:

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

不,不会的。

当您使用 C++20 编译器构建时,与它一起使用的标准库应该为 C++20 制作,因此实现 <=> 运算符,然后将使用该运算符如上所述。

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

【讨论】:

请注意,从技术上讲,这是一个小的兼容性中断。如果你以前直接调用operator<,那么你会得到一个编译错误。虽然真的,你不应该那样做。 @NicolBolas,你能详细说明一下吗? 在执行 v1 @GauravPant 不,无论您使用什么版本的标准库,都可以。

以上是关于为啥在 C++ 20 中从标准库容器中删除了比较运算符?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 C++ 中从标准输入读取行比 Python 慢得多?

为啥C++标准库中没有transform_if?

为啥 C++ 标准库中没有 SIMD 功能?

C++的探索路20标准模板库STL之STL的基本概念与容器

C++的探索路20标准模板库STL之STL的基本概念与容器

c++泛型算法