为什么C++20知道如何散列string_view,但不知道如何散列span<char>?

NoS*_*tAl 6 c++ string-view c++20 std-span

我最好的猜测是,委员会要么忘记了这个用例,要么不想使用概念/要求将类型限制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
}
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*las 2

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

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

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

  • @GManNickG 我可以向你指出删除它的论文,但老实说,这是针对一篇相当糟糕的论文而做出的一个非常糟糕的决定,我们都因此而变得更糟。 (2认同)