![](/img/trans.png)
[英]Apple clang and C++20 operator ambiguity with inherited comparison operator
[英]Difference between equivalent and equal for c++20 three way comparison operator?
在 c++20 中引入了新的三路比较运算符 <=>(宇宙飞船运算符),它可以产生以下四个值:
但是,当我在代码片段下面运行时,似乎相等和等价都是一回事,所以我想知道它们之间的区别是什么,以及在什么情况下我们应该更喜欢一个。
#include <iostream>
#include <compare>
int main()
{
std::strong_ordering res = (2<=>2);
if(res == std::strong_ordering::equivalent)
{
std::cout<<"Equivalent...."<<std::endl;
}
if(res == std::strong_ordering::equal)
{
std::cout<<"Equal"<<std::endl;
}
return 0;
}
开/关:
相等的....
平等的
正如cppreference所说,两者之间没有区别。 但是, std::strong_ordering
是唯一定义equal
的类别。 所有其他类别仅定义equivalent
。
从语言学上讲, equivalent
的意思是“按照一定的标准被认为是相等的,但可能有不相关的差异”,而equal
的意思是“无法区分”。 因此,平等意味着等价。
当比较考虑到对象的所有属性时,通常使用std::strong_ordering::equal
(和equivalent
):
从cppreference :
暗示可替代性:如果 a 等价于 b,则 f(a) 也等价于 f(b),其中 f 表示一个函数,该函数仅读取可通过参数的公共 const 成员访问的比较显着状态。 换句话说,等效值是无法区分的。
而std::{weak,partial}_ordering::equivalent
旨在用于不同对象被认为相同但可能具有不相关差异的情况。
它们在数字上和概念上都是一样的。 如果比较在被比较的项目之间产生强排序,则等价和相等是相同的。
之所以有两个词,是因为这对于其他类型的排序是不一样的。 弱与偏根本不相等; 它们仅提供等效性。
等价意味着两个对象可以比较相等。 平等意味着更强大的东西; 如果它们比较相等, 则可以在任何 const 用法中替换另一个:
只要
a == b
为真,f(a) == f(b)
的属性就为真,其中f
表示一个函数,该函数仅读取可通过参数的公共 const 成员访问的比较显着状态。
如果一个类型的比较允许相等(这是强排序的要求),那么它也允许相等。 因此,对于强排序比较,它们是相同的。
假设我们正在讨论一个我们将标记为<
的排序关系。 现在,对象a
和b
的等价意味着a < b
和b < a
都是假的。 即两者都“不小于”另一个。 平等意味着它们必然共享相同的值,而不仅仅是不按关系排序。
一个典型的例子是不区分大小写的字符串类型。 我们想在不考虑字母大小写的情况下按字典顺序比较字符串。 因此,例如,我们将有"aA" < "aa"
和"aa" < "aA"
都是错误的。 在该顺序下,字符串是等价的,但它们肯定不相等。
https://en.cppreference.com/w/cpp/named_req/EqualityComparable
对于既是 EqualityComparable 又是 LessThanComparable 的类型,C++ 标准库对相等性(即表达式 a == b 的值)和等价性(即表达式的值 !(a < b) && !( b < a)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.