我正在努力为枚举 class 提供新的宇宙飞船操作员。让我们举以下例子: 但很明显我在这里弄错了,因为我的main()仍然告诉我,蚂蚁比老虎大。 如您所见,我试图显式删除默认的比较运算符,以强制编译器使用我的自定义太空船一号,但没有成功。 当我显式调用auto result = Animals::A ...
我正在努力为枚举 class 提供新的宇宙飞船操作员。让我们举以下例子: 但很明显我在这里弄错了,因为我的main()仍然告诉我,蚂蚁比老虎大。 如您所见,我试图显式删除默认的比较运算符,以强制编译器使用我的自定义太空船一号,但没有成功。 当我显式调用auto result = Animals::A ...
我正在尝试明确实施宇宙飞船运营商。 以下是一个失败的简单示例。 我究竟做错了什么? 神栓链接 ...
以下代码在 GCC 和godbolt上编译得很好,但在我的 MacBook 上,在 Xcode 14 中它死了:#include <iostream> #include <compare> #include <tuple> using std::cout; us ...
c++20默认比较运算符是一个非常方便的功能。 但是我发现如果 class 有一个空的基础 class,它的用处就会减少。 默认操作符<=>通过依次比较基数(从左到右深度优先)和非静态成员(按声明顺序)T的子对象来计算<=>,递归扩展数组成员(在增加下标的顺序),并在发现 ...
以下代码旨在对包含数组的对象实现比较。 如果所有数组元素都这样比较,则两个对象应该比较为<,==,> 。 由于各种原因,以下内容无法编译: 首先,比较数组: call to implicitly-deleted default constructor of 'array<st ...
在此代码示例中,似乎添加不相关的 operator== (在不同的类型上)会使 saceship opreator 不起作用。 这是在 VS2019 中测试的。 它是编译器错误还是一些奇怪的行为? 我得到的错误是 B 类中运算符的使用是: 二进制“==”:未找到采用“const B”类型的左侧 ...
简单任务:我有这两种类型 我想使用这个新的 C++20 宇宙飞船操作,每个人都说它很酷,能够编写type_a{} == type_b{} 。 我没能做到。 即使我在它们之间写了operator<=> ,我也只能调用type_a{} <=> type_b{} ,但绝不是简单的 ...
编译器对以下代码的处理方式不同: GCC 和 MSVC 都接受它,但 Clang 不接受它返回错误: 演示: https://gcc.godbolt.org/z/WGrGTe89z 似乎 Clang 是这里唯一的一个,因为I::operator <=>(const I&) co ...
据此,宇宙飞船运算符 (<=>) 返回“一个小于、等于或大于零的 integer,具体取决于 $x 是小于、等于还是大于 $y”。 试一试,似乎只返回-1、0或1。 总是这样吗? ...
这个代码片段 在 C++17 (Visual Studio 2022) 中编译没有错误。 (有关更详细的示例,请参阅C++17 operator==() 和 operator!=() code failed with C++20 ;注意在这种情况下代码编译。) 尝试使用 C++20 构建相同 ...
如果我们有一个这样的枚举类 enum class alpha{ a, b, c, d}; 是否可以实现一个运算符,在字母表中的字母之间建立排序关系,使得 enum class alpha{ a, b, c, d}; constexpr auto operator <=> (al ...
看在线演示 当operator <=>就足够时,为什么我必须提供operator == ? ...
新的 C++20 宇宙飞船运算符是否允许以简洁的方式表达短路的多标准比较? 比这更好的东西: ...
我写了这个简单的代码,但它没有编译,因为比较被隐式删除了。 任何人都可以向我解释如何解决这个问题,或者至少为什么它不起作用? 编辑:使用“g++ -std=gnu++2a main.cpp”编译 Edit2:这是 output 的错误部分(后面有很多很多行候选): ...
#include <compare> #include <iostream> int main() { auto comp1 = 1.1 <=> 2.2; auto comp2 = -1 <=> 1; std::cout < ...
考虑S的以下两个重载operator<=> : 如果我将object S与int进行比较, #1将为我生成正确的运算符,因此像S{} <= 0 、 0 < S{}或0 <=> S{}这样的表达式就可以了。 但是,如果我将 object S与其他 object S ...
考虑以下无用的代码: Clang 和 MSVC 接受此代码,但 GCC拒绝它并显示错误消息: 哪个编译器是对的? operator<=如何从operator<=>合成? ...
令我惊讶的是,我遇到了另一个障碍,比如C++20 行为用相等运算符破坏现有代码? . 考虑一个简单的不区分大小写的键类型,与例如std::set或std::map : 简单测试: 使用 C++17,两个断言都通过(编译器资源管理器)。 切换到 C++20,第二个断言失败(编译器资源管理器) ou ...
动机:有时我使用 std::variant 来实现“花式”枚举,其中一些枚举状态可以携带 state。 现在,如果我想将<=>用于我的变体,它要求我的空结构已定义 <=>。 这对我来说似乎有点奇怪,因为如果类型有 0 位 state 则该类型的所有实例都是相同的。 完整示例 ...
编辑:这与宇宙飞船无关。 只是使用 spaceship 混淆了我的代码中的真正问题(有关详细信息,请参阅答案)。 我对这个程序的 output 感到惊讶:(如果您喜欢谜题,请随时打开 Godbolt 链接并尝试自己找出原因) output: 错误的错误的错误的错误的在指责 Godbolt 缓存之 ...