【发布时间】:2020-07-14 20:55:39
【问题描述】:
我在浏览cppreference,看到vector的比较操作在C++20中被去掉了,并且引入了宇宙飞船操作符(<=>)。在set 和map 等许多其他标准库容器中也可以看到同样的情况。
如何在新标准中进行比较?另外,C++20 会开始在旧代码上报错吗?
【问题讨论】:
标签: c++ c++20 spaceship-operator
我在浏览cppreference,看到vector的比较操作在C++20中被去掉了,并且引入了宇宙飞船操作符(<=>)。在set 和map 等许多其他标准库容器中也可以看到同样的情况。
如何在新标准中进行比较?另外,C++20 会开始在旧代码上报错吗?
【问题讨论】:
标签: c++ c++20 spaceship-operator
如果您继续浏览参考网站一点,您可能会来到default comparisons 上的部分,它简单地说:
简而言之,定义
operator<=>的类会自动获取编译器生成的运算符<、<=、>和>=。
因此,如果某个类存在“spaceship”运算符,编译器将使用<=> 运算符的结果自动生成剩余的比较运算符。
请注意,== 运算符是不生成的(即使它应该是可能的),但std::vector 保持operator== 的重载。
至于:
C++ 20 会开始在旧代码上报错吗?
不,不会的。
当您使用 C++20 编译器构建时,与它一起使用的标准库应该也为 C++20 制作,因此实现 <=> 运算符,然后将使用该运算符如上所述。
但是,如果您使用 C++20 编译器来构建旧标准库,则该旧标准库仍将实现旧的比较运算符。
【讨论】:
operator<,那么你会得到一个编译错误。虽然真的,你不应该那样做。