问题标签 [spaceship-operator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 三向比较运算符成员与非成员实现
在以下情况下,双向比较运算符应该是非成员函数:
- 您希望第一个操作数的类型不是此类
- 你想要隐式类型转换两个操作数中的任何一个
新的 C++20 三向比较运算符具有对称生成规则。表达式 的名称查找a@b
(其中@
是双向比较运算符)按顺序a@b
和a<=>b
(b<=>a
在从重载解决方案集中选择最佳匹配时出现歧义时使用此优先顺序)。有关详细信息,请参阅P0515R2。这意味着运算符<=>
可以是成员函数,并且仍然允许第一个操作数不是此类类型。
但是,该文件包含以下注释:
通常, operator<=> 应该只是一个成员函数;由于第 2.3 节中的对称生成规则,您仍将获得每个参数的转换。在极少数情况下,您还希望同时支持两个参数的转换(启用比较两个都不是此类型的对象,但使用此类型的比较函数),使其成为非成员朋友。
如果我理解正确,它说只有在需要同时对两个操作数进行隐式转换时才需要非成员实现?那是对的吗?我可以在需要时查看一个实际示例吗?我正在考虑这一点,尽管它似乎不是一个有效的例子:
c++ - 宇宙飞船操作员的真实世界使用示例
spaceship 运算符的定义意味着对排序有严格的定义,但这是否会影响您的客户端代码的编写方式,或者只是如何定义您的类比较运算符?
由于在其他帖子中缺少真实世界的示例,我并没有完全理解这部分。
关于宇宙飞船操作员的其他 SO 帖子:
ios - spaceship 如何从 Apple Developer Portal 获取 .cer 文件的 #id 值?
我有从我没有身份验证的客户端的Apple Developer Portal下载的.cer证书。我正在运行openssl x509来读取.cer,它没有显示任何与#id匹配的值(上传到 fastlane 托管存储库的.cer和.p12上的名称)但Team Id和Team Name
请建议当我无法使用Spaceship获取证书时如何在本地获取#id值(一旦我登录 Spaceship 就会返回#id值)?
参考:
https://www.rubydoc.info/github/fastlane/spaceship/Spaceship/Certificate
c++ - 非默认运算符 <=> 在 C++20 中不会生成 == 和 !=
我<=>
在 C++20 中使用新的宇宙飞船运算符遇到了一个奇怪的行为。我将 Visual Studio 2019 编译器与/std:c++latest
.
正如预期的那样,这段代码编译得很好:
但是,如果我将X更改为:
我收到以下编译器错误:
error C2676: binary '==': 'X' does not define this operator or a conversion to a type acceptable to the predefined operator
我也在clang上试过这个,我得到了类似的行为。
我会很感激一些解释为什么默认实现operator==
正确生成,但自定义的没有。
c++ - 在 C++20 中是否有一个浮点数的包装器可以让我默认宇宙飞船运算符?
我正在观看“使用 C++20 三向比较 - Jonathan Müller - Meeting C++ 2019”的演讲,其中提到了包含浮点成员的类的问题。
问题来自这样一个事实,即涉及 NaN(s) 的 IEEE 754 比较很奇怪并且不提供总排序。Talk 提供了一种解决此问题的方法,例如使用strong_order或在实现 <=> 时手动忽略 NaN 值(假设值永远不是 NaN)。
我的问题是,是否有一些库包装器可以让我说“我保证”我的浮点数永远不是 NaN ,或者会在浮点数上进行缓慢但有效的比较(因为现在订购了 NaN,所以速度较慢但更安全)。我的目标是通过使成员浮动飞船友好来避免手动实现飞船(所以我可以默认飞船)。
使用演讲中的示例:
c++ - 你如何反转strong_ordering?
有没有更简单的方法来实现这个功能的效果?
c++ - 函数指针的三向比较失败
为什么我不能将指向函数的指针与 GCC 主干进行比较?
给
c++ - 三向比较取代了除 == 之外的所有其他比较运算符?
在 g++ 10 中,我尝试使用三向比较,仅用于实验。
我读到不再需要其他运算符(== 除外)。
但即使我可以使用运算符(它在编译器上实现),它也不会取代(或暗示)!=。
因此,以下代码不起作用。
我在这里想念什么?
php - 如何不在 php 5.6 上执行一些 php 7 代码?
最近我有必要使用来与 PHP 5.6 向后兼容的代码,我使用 if 语句执行此操作,检查 php 版本以选择执行的代码。这是一个小例子:
我以为这样就足够了,但事实并非如此。PHP 仍在尝试执行 PHP 7 代码,使用 spaceship 运算符返回错误。任何人都知道为什么 php 仍在内部执行代码以及 if 语句明确表示不这样做以及如何解决这个问题?谢谢
c++ - 为什么在 C++ 20 中从标准库容器中删除了比较运算符?
我在浏览cppreference,看到vector
C++20中去掉了比较操作,<=>
引入了宇宙飞船操作符()。对于许多其他标准库容器(例如set
和map
.
如何在新标准中进行比较?另外,C++20 会开始在旧代码上报错吗?