问题标签 [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++ - 为什么我可以使用默认的 <=> 而不是用户提供的调用 ==?
用 clang-10 编译为clang -std=c++20 -stdlib=libc++ main.cpp
为什么A{} == A{}
有效但无效B{} == B{}
?
c++ - 为什么全球飞船运营商的行为不符合预期?
编译clang++ -std=c++20 -stdlib=libc++ main.cpp
和错误消息:
为什么全球飞船运营商的行为不符合预期?
c++ - 如何强制 std::weak_ordering
在试用新品时领带拦截器三向比较运算符<=>
我想知道这样的例子是什么
会导致编译器错误
但不与
什么是一个例子Foo
?换句话说,如何Foo
不暗示可替代性?我知道我可以编写自己的返回运算符的实现,std::weak_ordering ... less/greater/equivalent
但是如何强制编译器这样做呢?
到目前为止,我已经阅读了 strong_ordering 和 weak_ordering的实际含义。
c++ - 为什么此 clang 代码无法使用带有 -std=c++20 的 clang 10 编译
以下程序无法使用 clang10 和 -std=c++20 编译
使用 -std=c++17 它可以工作。
这是编译尝试输出(请注意,我对 C++17 中的链接器错误很好,因为我没有将所需的 -l 提供给命令行)
笔记:
标记了这艘宇宙飞船,因为我不知道与 != == C++20 中的更改相关的标签
无法减少这个例子,因为 DenseMap 是一个类的怪物,我发现了类似的问题,解决方案是操作符缺少 const 限定符,这似乎不是问题(我可以在源代码中看到 const),当我试图在一个简单的案例中得到类似的错误时,我没有得到一个错误。
c++ - 为什么默认三通运算符(spaceship <=>)生成相等运算符(==)而用户定义三通运算符不?
考虑这段代码:
https://wandbox.org/permlink/SLmLZOc18RaJV7Mu
删除评论以获取错误。
首先我想问一下为什么默认的三路运算符的行为与用户定义的运算符不同?
其次,这个问题的解决方案对课堂来说是正确的C
还是应该以不同的方式处理?
这只是一个简单的例子,我对数十个字段和联合有更复杂的情况(如果你不明白我的意思,请查看一些英特尔 API ;))。
编辑:
这个问题Equality operator does not get defined for a custom spaceship operator implementation in C++20重点是为什么用户定义的 3 路运算符没有默认相等运算符,我想知道为什么默认值和用户存在差异定义行为?
编辑2:
我稍微修改C
了示例中的类以描绘更多现实生活中的问题(当默认运算符不是有效的解决方案时)。我还想澄清一下,我想知道这些差异背后的原因(用户定义和默认运算符之间),以便能够评估我的现实生活中的解决方案是否正确(类似于C
),因为我确实更看重代码可维护性而不是性能我现在正在工作的代码的一部分。
c++ - 检查类型是否为偏序
可以在 C++20 中检查类型的部分排序属性吗?如果是这样,如何使用概念进行这样的检查?
以下代码是否足以达到此目的?
c++ - C++ 20 中的运算符 == 和 <=> 应该实现为成员函数还是自由函数?
注意:我认为这在技术上与此问题重复,但是:
- C++20 中的更改
==
非常激进,我不确定恢复 9 年的问题是否正确。 - 我特别询问了运算符
==
以及<=>
正在被编译器重写的运算符,而不是例如 operator<
。
ps 目前我有自己的看法(基于 foonathan 的一些谈话),但这只是当前的偏好,我不希望对潜在的答案产生偏见。
c++ - 为什么我需要包括获取 <=> 编译的标头?
我知道技术上的答案是:因为标准是这样说的。
但我对动机感到困惑:
我在默认情况下看不到任何“库” <=>
:它可能会返回某种在技术上定义的类型,std
但在某种意义上它是“假库”类型,编译器必须知道它,因为它必须能够默认operator <=>
返回auto
类型(更不用说好的编译器中指定的错误消息,<compare>
所以很明显这里有一个语言<=>库链接)。
所以我知道有一些库功能可能需要我包含<compare>
,但我不明白为什么默认<=>
需要我包含该头文件,因为编译器无论如何都必须知道制作<=>
.
注意:我知道大多数时候其他一些标准头文件会包含<compare>
,这是一个关于语言/库设计的问题,而不是 C++ 强迫我在没有充分理由的情况下编写的额外一行。
c++ - 尝试在派生类中使用宇宙飞船运算符
我正在尝试在基类中使用宇宙飞船运算符,因此我将通过编译器定义所有运算符。(来源:https ://devblogs.microsoft.com/cppblog/simplify-your-code-with-rocket-science-c20s-spaceship-operator/ )
但是我遇到了我不明白的问题。
源代码:https ://godbolt.org/z/SZnNfK
输出:
使用 USE_SPACESHIP:
正确的 A 比 B 更老
错误的 AA 不比 BB 旧 // <--- 这是错误的,AA 是旧的
没有使用太空船:
正确的 A 比 B 更老
正确的 AA 早于 BB
当我自己在基类中实现运算符 < 和 > 时,即使我正在比较具有相同基类的不同类,比较也会起作用。
但是当我使用 spaceship 运算符时,比较仅在应用于具有相同基数的相同 ClassType 时才有效。
这两种方法有何不同?
注意:我只想比较基类的时间戳,而不是基类的任何其他成员或派生类
取消定义使用经典运算符重载的 USE_SPACESHIP 宏
谢谢你。
编辑:我尝试使用 CRTP 方法,但遇到了同样的问题。
c++ - 带有运算符“<=>”的 C++ 模板类错误(错误 C2678)
我正在尝试在 C++ 中创建一个陷阱类。我有这个类的 .h 和 .cpp 文件,以及一个测试类。当我尝试构建它时,我的 'add' 方法给了我以下错误:“错误 C2678:二进制 '<=>':未找到采用 'E' 类型的左操作数的运算符(或者没有可接受的转换)"
这是我的代码:
处理.h
treap.cpp
TreapTest.cpp
导致错误的行是第 13 行和第 26 行(也就是飞船操作员的行)。我使用的是 VS 2019,C++ 语言标准是 C++20。PS:我是 C++ 的新手。我正在将现有的 Java 代码转换为 C++,作为理解和学习 C++ 的练习。
编辑:好的,我做了一些@cdhowie 和@interjay 建议的更改。但是这些建议都没有帮助解决这个特定问题(我有点预料到,因为代码编译时没有解决方案中的测试文件,这意味着尽管我犯了愚蠢的错误,但原始代码编译得很好)。
另外,@Barry,我希望这些更新更适合该标准。