` C 20 中的运算符? " />
非默认运算符 以及缺少 == 和 !=
在 C 20 中,宇宙飞船运算符 ; 提供了通用比较机制。但是,使用自定义三向比较实现时会出现奇怪的行为。
默认实现生成 == 和 !=
考虑使用 的默认实现的以下代码:
struct X { int Dummy = 0; auto operator<=>(const X&) const = default; // Default implementation };
在这种情况下,代码编译成功并允许使用 == 和 != 来比较 X 的实例:
X a, b; a == b; // OK!
自定义实现块 == 和 !=
但是,当提供 的自定义实现时:
struct X { int Dummy = 0; auto operator<=>(const X& other) const { return Dummy <=> other.Dummy; } };
编译导致错误:
error C2676: binary '==': 'X' does not define this operator or a conversion to a type acceptable to the predefined operator
行为原因
根据 C 20 标准,此行为是故意的:
如果类定义没有显式声明 == 运算符函数,而是声明默认三向比较函数,则隐式声明 == 运算符函数,其访问权限与三向比较运算符函数相同.
只有默认的;运算符生成一个合成的 ==。这是因为像 std::vector 这样的类不应该使用非默认的 。对于相等测试,因为它可能比自定义实现效率低。
因此,如果一个类有一个自定义 ;实现时,程序员还必须提供自定义 == 实现以确保正确的比较行为。
以上是为什么在 C 20 中不能将 `==` 和 `!=` 与自定义 `<=>` 运算符一起使用?的详细内容。更多信息请关注PHP中文网其他相关文章!