`equality_comparable_with` 是否需要要求 `common_reference`?

Nic*_*las 19 c++ c++-concepts c++20

概念equality_­comparable_with<T, U>旨在声明类型T和 的对象U可以相互比较,如果它们是,则这具有预期的含义。没关系。

但是,这个概念也需要common_reference_t<T&, U&>存在。其主要推动力common_reference及其伴随的功能似乎是启用代理迭代器,有一个地方来表示此类迭代器之间的关系reference以及value_type此类迭代器的关系。

太好了,但是……这与测试 aT和 a 是否U可以相等有什么关系?为什么标准要求这样做T并且U有一个共同的参考关系只是为了让你比较它们相等?

这会产生奇怪的情况,其中很难有两种类型没有合理地具有逻辑可比性的公共引用关系。例如,vector<int>pmr::vector<int>逻辑上应该是可比的。但它们不可能,因为这两种不相关的类型之间没有合理的公共引用。

T.C*_*.C. 6

这可以追溯到Palo Alto 报告§3.3 和 D.2。

为了使交叉类型概念在数学上合理,您需要定义交叉类型比较的含义。对于equality_comparable_witht == u通常意味着tu相等,但是不同类型的两个值相等意味着什么?该设计表示跨类型相等是通过将它们映射到公共(引用)类型来定义的(需要这种转换来保留值)。

当 的强公理equality_comparable_with不可取时,标准使用仅说明的概念weakly-equality-comparable-with,并且该概念不需要公共参考。然而,它是一种“语义上的可憎”(用凯西卡特的话来说)并且只是出于这个原因的说明:它允许拥有t == ut2 == u但是t != t2(这实际上是哨兵所必需的)。

  • 这很有趣,但这并不能解释为什么“数学上合理”的解决方案涉及这种“公共引用”类型,而不是......好吧,*其他任何东西*。也就是说,为什么它涉及执行这种隐式引用转换业务,而不是允许逻辑数学上合理的概念(例如“container&lt;T, stuff&gt;”和“container&lt;U, other_stuff&gt;”)进行比较,如果“T”与“U”相当)?仅仅是“common_reference”可用,还是还有更多内容? (4认同)