如何阅读c++ iso标准?我是说路

how to read c++ iso standard? i mean the way

我正在看n4860,对这个有点好奇

我不知道怎么解释,所以我就举个例子。

现在我在看“unordered_set”,草稿说

template<class Key,
    class Hash = hash<Key>,
    class Pred = equal_to<Key>,
    class Allocator = allocator<Key>>
class unordered_set;

并且我推断,当我制作自定义密钥 class 时,我应该制作散列,equal_to,分配器 class 并将其填充到容器中正常工作。

但我找不到 classes 中应该填写的内容。

例如,如果我制作自定义 Key class 并且我必须使用 operator(const Key& key) 方法制作 Hash class,并使用 operator(const Key& key1, const Key& key2) 方法。

还有另一个例子,Hash class with operator(const Key& key) should return size_t or may be unsigned long int(?) not like string.

我可以通过网络搜索和编译器错误消息找到该信息,但我在草稿中找不到。

draft没有这样的信息吗?或者我错过了这些信息,因为我不知道如何阅读它?

std::unordered_map 的要求列在 C++20 草案的 22.2.7 部分。 Hash的要求在22.2.7.1.3中表述为:

Each unordered associative container is parameterized by Key, by a function object type Hash that meets the Cpp17Hash requirements ([hash.requirements]) and acts as a hash function for argument values of type Key, and by a binary predicate Pred that induces an equivalence relation on values of type Key. Additionally, unordered_­map and unordered_­multimap associate an arbitrary mapped type T with the Key.

[hash.requirements] 在本标准的 16.4.4.5 部分。

预先要求在 22.2.7.1.5:

Two values k1 and k2 are considered equivalent if the container's key equality predicate pred(k1, k2) is valid and returns true when passed those values. If k1 and k2 are equivalent, the container's hash function shall return the same value for both.


一般来说,在标准中查找不同的需求是不可行的(除非你正在使用编译器或基于标准的资源,如 cppreference)。这并不是真正的目的,因为它必须是一份考虑到每一种可能性的法律文件。我建议改用 cppreference。从第 std::unordered_map 页我们可以看到它必须满足 UnorderedAssociativeContainer requirements, which direct us to pages about Hash requirement and to BinaryPredicate 要求。