非默认运算符以及 == 和 != 的缺失
在 C 20 中,新引入的宇宙飞船运算符 () 引发了有关 == 和 != 运算符生成的一些意外行为。用户在使用具有自定义实现的非默认 spaceship 运算符时可能会遇到编译错误。
默认情况下,spaceship 运算符会比较给定类型的两个对象。如果类没有显式定义 == 运算符,但定义了默认的非默认 spaceship 运算符,则编译器将自动生成一个 == 运算符,其访问权限与 spaceship 运算符相同。这种行为在语言标准 [class.compare.default] 中指定,确保像 std::vector 这样的类不会使用非默认的太空飞船运算符进行相等性测试。
但是,如果太空飞船运算符不是默认(即,它有自定义实现),编译器将不会生成 == 运算符。这是因为定义自定义宇宙飞船运算符的类可能需要 == 的专门实现来处理特定的比较场景。因此,语言将其留给程序员在需要时显式定义 == 运算符。
例如,考虑以下代码:
#include <compare> struct X { int Dummy = 0; auto operator<=>(const X&) const = default; // Default implementation };
此代码编译成功,因为太空飞船运算符是默认的,编译器生成 == 运算符。但是,如果我们将 spaceship 运算符更改为自定义实现:
struct X { int Dummy = 0; auto operator<=>(const X& other) const { return Dummy <=> other.Dummy; } };
代码现在将无法编译,并出现错误,指示未为类 X 定义 == 运算符。这是因为修改后的 spaceship 运算符不是默认的,编译器不会自动生成 == 运算符。在这种情况下,用户需要显式定义 == 运算符来满足其自定义类的比较需求。
以上是为什么自定义 `spaceship` 运算符在 C 20 中不生成 `==` 和 `!=` 运算符?的详细内容。更多信息请关注PHP中文网其他相关文章!