宇宙飞船运算符和等式比较
C 20 宇宙飞船运算符(也称为 )引入了方便简洁的语法用于比较值。但是,在某些情况下,它可能不会生成预期的相等和不等运算符(== 和 !=)。本问题探讨了这种行为以及为什么自定义太空飞船运算符实现可以阻止创建这些附加运算符。
问题描述
考虑以下代码片段,其中太空飞船运算符在具有默认实现的结构中使用:
struct X { int Dummy = 0; auto operator<=>(const X& other) const = default; // Default implementation };
此代码编译时没有错误。但是,如果我们定义自定义太空飞船运算符实现:
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
解释
根据语言标准的定义,此行为是有意的。当类具有默认的太空船运算符时,编译器会合成相等运算符的默认实现。然而,如果太空船运算符是用自定义定义实现的,编译器不会自动生成相等运算符。
这种区别源于对效率的考虑。宇宙飞船运算符旨在提供值的完整排序,而相等运算符 (==) 可以执行优化,例如在尝试完全比较之前比较大小。对于像 std::vector 这样的类,使用 spaceship 运算符进行相等比较可能不是最有效的方法。
通过将其留给程序员来实现相等运算符,编译器可以避免生成非- 优化实施。因此,如果一个类具有非默认的太空船运算符,则开发人员还必须显式定义相等运算符。
以上是为什么 C 20 中的自定义宇宙飞船运算符会阻止自动相等比较?的详细内容。更多信息请关注PHP中文网其他相关文章!