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


12

概念equality_­comparable_with<T, U>旨在声明类型的对象TU可比较彼此相等,而如果是这样,则这具有预期含义。没关系。

但是,这个概念也必须common_reference_t<T&, U&>存在。对于主要推动力common_reference和随之而来的功能似乎是启用代理迭代器,有代表之间的关系的地方reference,并value_type为这样的迭代器。

太好了,但是...与a T和a是否U可以彼此相等进行测试有什么关系?为什么标准要求这样做TU具有共同的引用关系,以使您可以比较它们相等?

这就产生了奇怪的情况,在这种情况下,很难拥有两种在逻辑上不具有合理可比性的公共参照关系的类型。例如,vector<int>并且pmr::vector<int>在逻辑上应该是可比较的。但是它们之所以不可以,是因为这两个原本不相关的类型之间没有合理的公共引用。


@Marshall会批准这个问题。
巴里

好吧甚至assignable_from需要common_reference...
cpplearner

@cpplearner:至少在某种意义上说得通,因为赋值是代理引用和值希望共享的属性。
Nicol Bolas

Answers:


4

这一直可以追溯到Palo Alto报告的第 3.3节和D.2。

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

equality_comparable_with不需要强公理的地方,该标准使用仅博览会的概念weakly-equality-comparable-with,并且该概念不需要通用的参考。但是,它是“语义可憎的”(用Casey Carter的话来说),并且仅出于此原因而进行阐述:它允许具有t == uand t2 == ut != t2(这实际上对于哨兵而言是必需的)。


2
这很有趣,但这并不能解释为什么“数学上合理的”解决方案涉及这种“通用参考”类型而不是...好吧,其他任何东西。也就是说,为什么不进行隐式参考转换业务,而不是进行不允许转换的逻辑上合理的概念(例如container<T, stuff>container<U, other_stuff>如果T与相当,则是可比的U)?仅仅common_reference是可用的,还是还有更多呢?
Nicol Bolas

它缺乏这样的想法,即向common_reference类型的转换函数是一种同构。
Oliv
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.