在 C 20 中使用新的 spaceship 运算符 () 时,重要的是要注意实现自定义运算符与依赖默认实现的含义。
在第一个示例中,您使用的是默认运算符;语言提供的实现。此默认实现允许编译器自动生成 == 运算符。但是,当您实现自定义运算符时函数时,编译器无法再隐式生成相应的 == 运算符。
这种行为是有意为之,如 C 标准中所述 ([class.compare.default](https://en.cppreference.com /w/cpp/language/comparison#Class_comparison)):
If the class definition does not explicitly declare an == operator function, but declares a defaulted three-way comparison operator function, an == operator function is declared implicitly with the same access as the three-way comparison operator function.
这种设计选择背后的原因是为了防止在可能不是最有效的确定方法的情况下隐式生成 ==平等。例如,像 std::vector 这样的类不应使用非默认的 。用于相等测试,因为首先比较大小更有效。
在自定义 中实现时,该类可能正在执行专门的操作,这些操作也需要 == 的自定义实现。因此,该语言不会生成潜在的非最佳默认实现,而是让程序员明确定义 == 运算符。
以上是为什么非默认的 Spaceship 运算符在 C 20 中不生成 `==` 和 `!=`?的详细内容。更多信息请关注PHP中文网其他相关文章!