c++ - `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>
上应该是可比的。但它们不可能是因为在这两种原本不相关的类型之间没有合理的共同引用。
解决方案
这可以追溯到帕洛阿尔托报告,§3.3 和 D.2。
为了使交叉类型概念在数学上合理,您需要定义交叉类型比较的含义。对于equality_comparable_with
,t == u
通常意味着t
和u
相等,但是对于两个不同类型的值相等意味着什么呢?设计说跨类型相等是通过将它们映射到公共(引用)类型来定义的(需要这种转换来保留值)。
在不需要强公理的equality_comparable_with
情况下,该标准使用仅说明概念weakly-equality-comparable-with
,并且该概念不需要共同参考。然而,它是一种“语义上的憎恶”(用凯西卡特的话来说),并且仅出于这个原因进行说明:它允许拥有t == u
and t2 == u
but t != t2
(这实际上对于哨兵来说是必要的)。
推荐阅读
- sql - SQL Server 2019 - 添加日期和时间组件
- javascript - 我正在尝试用 JavaScript 编写 Discord 机器人,但遇到了问题
- bash - 在以下情况下,/bin/bash $0 $0 在第 5 行做什么?
- python - 有概率的简单突变
- c# - Entity Framework C# Table 未使用 add 方法更新数据
- sql-server - 如何按月划分金额和订单?sql服务器
- c++ - 输入数据的时间复杂度
- python - TensorFlow 2.x:无法以 h5 格式保存训练模型(OSError:无法创建链接(名称已存在))
- c# - HttpClient Polly 超时策略
- python - {Discord.py-rewrite} Bot 命令在我有“On Message”事件时不起作用