问题标签 [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++ - 可以在折叠表达式中使用宇宙飞船运算符吗?
我试过的编译器都不接受这样的代码:
template <int ...a> bool foo() { return (a<=> ... <=>0); }
但对于任何其他<=,>=,==,!=,<,>
它编译。
cppreference在这里很清楚 -<=>
我们可以用于折叠表达式的二元运算符列表中没有。
这是 C++ 标准中的故意遗漏,还是编译器还没有准备好?
这个问题只是纯粹的好奇。我只是想知道这个领域的 C++ 方向是什么。我可以想象所有其他比较运算符都将从允许运算符的折叠表达式列表中删除,因为它们与<=>
折叠表达式一样有意义......
c++ - 排序类 C++ 中数据成员的可见性不一致
由于运算符<=>
是在 C++20 中引入的,因此我们首先需要<compare>
在使用之前包含(内置和默认)。
但是,我在每个实现(可能使用编译std::weak_ordering
器)中std::partial_ordering
看到了每个排序(用于非类型模板参数。std::strong_ordering
operator<=>
我已经在 3 个主要的库实现中测试了这段代码:libstdc++
、、libc++ (or libcxx)
和STL
:
在哪里:
STL
从MSVC
过去。(https://godbolt.org/z/8r88sf4qv)libstdc++
从GCC
失败。(https://godbolt.org/z/Mbdzf48Pv)libc++
从Clang
也失败了。(https://godbolt.org/z/9PxdTra3r)
据透露,只做STL
数据成员public
,其余的都是private
(我的意思是只有数据成员)
我很满意,STL
因为它使返回值在 中可用NTTP
,但作为交换,它将数据成员公开给公众。
哪个库实现是正确的?还是取决于每个实现?
c++ - 有什么方法可以让哪个成员 C++20 默认比较失败?
我经常在有 defaulted<=>
或 defaulted的结构/类上编写测试期望==
。
问题是,当期望失败时,我不知道是什么成员导致了失败(通常我使用EXPECT_EQ
so ==
returned false
)。原因是<=>
/==
基本上是编译器生成的黑匣子。
我知道 C++ 没有反射,但是是否有一些技巧可以让两个实例之间不匹配?
为了清楚起见,这里是一个简短的示例(在实际代码中,数据通常要复杂得多,并且从查看不匹配的值来看并不明显):
我知道 protobuf 有反射,并且我可以使用 Boost.Describe 用元数据装饰我的结构,这个问题是关于纯粹的 ISO C++ 解决方案,而不对结构进行任何更改。
另外我知道我可以手动比较成员,这就是我现在遇到这个问题时所做的(或者只是查看结构的值),但我想“自动化”这个过程。
c++ - operator==() 代码编译 w/C++17 但不是 C++20
此代码段
在 C++17 (Visual Studio 2022) 中编译没有错误。(有关更详细的示例,请参阅C++17 operator==() 和 operator!=() 代码在 C++20 中失败;请注意,在这种情况下,代码会编译。)
尝试使用 C++20 构建相同的代码会产生三个编译器错误:
是的,我知道C++20 会综合operator!=
等等......但是现有的 C++17 代码不应该仍然用 C++20 编译吗?如何解决问题,以便相同的代码同时使用 C++17 和 C++20 编译并生成相同的结果?
对派生类进行更改可能很困难,因为该代码可能在其他地方(这实际上是库代码);最好对Base
. _
c++ - 当父类没有为自己定义飞船运算符时覆盖飞船运算符
编译器对以下代码的处理方式不同:
GCC 和 MSVC 都接受它,但 Clang 不接受它返回错误:
演示:https ://gcc.godbolt.org/z/WGrGTe89z
似乎只有 Clang 在这里,因为I::operator <=>(const I&) const
没有定义,所以A::operator <=>(const A&) const
必须隐式删除,并且删除的方法不能覆盖未删除的方法I
。其他编译器是否也有权接受代码?
c++ - 如何使用三路比较(spaceship op)实现不同类型之间的operator==?
简单任务:我有这两种类型
我想使用这个新的 C++20 宇宙飞船操作,每个人都说它很酷,可以写type_a{} == type_b{}
。我没能做到。即使我operator<=>
在它们之间写,我也只能调用type_a{} <=> type_b{}
,但从来没有简单的比较。这让我很困惑,因为只有一个类,三向比较也定义了所有其他类。
替代配方?如何使它成为std::three_way_comparable_with<type_a, type_b>
真的?