4

我最好的猜测是,委员会要么忘记了这个用例,要么不想使用概念/要求将span类型限制为可以安全散列的东西(POD,无填充),或者他们不想要一半的解决方案(等待反射)...

如果有人对这里感兴趣,godbolt链接带有无用的错误消息和代码,但我认为我的问题很清楚,没有任何代码。

#include <span>
#include <unordered_set>
#include <string_view>
int main() {
    std::hash<std::string_view> h1;
    std::hash<std::span<char>> h2; // error here
}

注意:我知道在散列方面缺少 C++std::库,例如它不能散列std::pair<int,int>,但我的问题特别是关于std::span.

4

1 回答 1

2

string_view绝对是一个字符串;aspan<char>只是chars 的数组。它可能具有与 a 相同的概念含义string_view,但您不能说这对于该类型而言是固有的。span<char>因此,标准假设每个都应该被等同于字符串是不合理的。

大多数容器没有标准定义的散列(字符串容器是唯一的例外)。原因是对于Ts 序列没有一个好的默认哈希算法。即使有,span<char>使用该算法几乎肯定不会产生与 a 相同的哈希值string_view

此外,这两种类型对等价的处理方式不同。string_viewoperator==过载;span<T>才不是。散列在概念上基于相等:如果两个对象比较相等,则这些对象产生的散列必须相等。但是由于span根本没有相等性测试,散列 aspan没有什么意义。

于 2021-07-21T17:31:21.203 回答