`equality_comparable_with` 是否需要 require `common_reference`?
Does `equality_comparable_with` need to require `common_reference`?
concept equality_comparable_with<T, U>
的目的是声明 T
和 U
类型的对象可以相互比较,如果是,那么这具有预期的含义。没关系。
但是,这个概念也需要 common_reference_t<T&, U&>
存在。 common_reference
及其附带功能的主要推动力似乎是 ,以便有一个地方来表示此类迭代器的 reference
和 value_type
之间的关系。
太好了,但是...这与测试 T
和 U
是否可以相互比较有什么关系?为什么标准要求T
和U
有一个共同的引用关系只是为了让你比较他们相等?
这会产生奇怪的情况,在这种情况下,很难拥有两种类型,它们不合理地具有逻辑上可比较的共同引用关系。例如,vector<int>
和 pmr::vector<int>
在逻辑上应该是可比较的。但它们不可能是因为在这两种不相关的类型之间没有合理的共同引用。
这一直追溯到 Palo Alto report、§3.3 和 D.2。
为了使跨类型概念在数学上合理,您需要定义跨类型比较的含义。对于equality_comparable_with
,t == u
一般表示t
和u
相等,但是两个不同类型的值相等又是什么意思呢?设计表明,跨类型相等性是通过将它们映射到公共(引用)类型来定义的(需要进行此转换以保留值)。
在不需要 equality_comparable_with
的强公理的地方,标准使用仅说明概念 weakly-equality-comparable-with
,并且该概念不需要一个共同的参考。然而,它是“语义上的可憎”(用 Casey Carter 的话说),并且仅出于这个原因进行说明:它允许 t == u
和 t2 == u
但 t != t2
(这是哨兵实际上是必需的)。
concept equality_comparable_with<T, U>
的目的是声明 T
和 U
类型的对象可以相互比较,如果是,那么这具有预期的含义。没关系。
但是,这个概念也需要 common_reference_t<T&, U&>
存在。 common_reference
及其附带功能的主要推动力似乎是 reference
和 value_type
之间的关系。
太好了,但是...这与测试 T
和 U
是否可以相互比较有什么关系?为什么标准要求T
和U
有一个共同的引用关系只是为了让你比较他们相等?
这会产生奇怪的情况,在这种情况下,很难拥有两种类型,它们不合理地具有逻辑上可比较的共同引用关系。例如,vector<int>
和 pmr::vector<int>
在逻辑上应该是可比较的。但它们不可能是因为在这两种不相关的类型之间没有合理的共同引用。
这一直追溯到 Palo Alto report、§3.3 和 D.2。
为了使跨类型概念在数学上合理,您需要定义跨类型比较的含义。对于equality_comparable_with
,t == u
一般表示t
和u
相等,但是两个不同类型的值相等又是什么意思呢?设计表明,跨类型相等性是通过将它们映射到公共(引用)类型来定义的(需要进行此转换以保留值)。
在不需要 equality_comparable_with
的强公理的地方,标准使用仅说明概念 weakly-equality-comparable-with
,并且该概念不需要一个共同的参考。然而,它是“语义上的可憎”(用 Casey Carter 的话说),并且仅出于这个原因进行说明:它允许 t == u
和 t2 == u
但 t != t2
(这是哨兵实际上是必需的)。