首页 > 解决方案 > `equality_comparable_with` 是否需要 `common_reference`?

问题描述

概念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>上应该是可比的。但它们不可能是因为在这两种原本不相关的类型之间没有合理的共同引用。

标签: c++c++20c++-concepts

解决方案


这可以追溯到帕洛阿尔托报告,§3.3 和 D.2。

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

在不需要强公理的equality_comparable_with情况下,该标准使用仅说明概念weakly-equality-comparable-with,并且该概念不需要共同参考。然而,它是一种“语义上的憎恶”(用凯西卡特的话来说),并且仅出于这个原因进行说明:它允许拥有t == uand t2 == ubut t != t2(这实际上对于哨兵来说是必要的)。


推荐阅读