7

cppreference 中的此页面提到std::hash已专门用于std::optional,但未指定对象脱离时的行为。我可以想到不同的行为:

  • 它可以抛出一个std::bad_optional_access, 以保持一致std::optional::value
  • 它可以为每个 disengaged 返回相同的哈希std::optional<T>,这样 2 disengaged 对象将具有相同的哈希。
  • 它可以返回一个std::optional<std::hash<std::optional<T>>>
4

2 回答 2

6

C++14 CD 在 [optional.hash]/3 中说:

对于o类型的对象optional<T>,如果bool(o) == truehash<optional<T>>()(o)应评估为与 相同的值hash<T>()(*o)

因此,我会说未指定散列函数为脱离对象返回的内容。

于 2013-10-02T10:36:39.247 回答
1

我不确定它是否相关,因为 C++14std::optional最终没有。正如乔纳森所说,其意图(尽管最初并未反映在标准语言中)一直是脱离的可选对象的哈希返回一个未指定的值。

这一意图反映在Fundamentals TS中。

这个想法是标准库的实现选择它想要如何表示一个脱离optional<T>并记录它自己。它可以为不同的类型选择不同的值,在调试和发布模式下也可以选择不同的值。

于 2015-12-03T09:18:07.647 回答