脱离的std :: optional <t>对象的哈希是什么?</t>

时间:2013-10-02 08:18:40

标签: c++ hash standard-library optional c++14

来自cppreference的

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

  • 它可以抛出std::bad_optional_access,与std::optional::value
  • 保持一致
  • 它可以为每个脱离的std::optional<T>返回相同的哈希值,这样2个脱离对象就会有相同的哈希值。
  • 可能会返回std::optional<std::hash<std::optional<T>>>

2 个答案:

答案 0 :(得分:6)

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

  

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

所以我会说它没有指定哈希函数为一个脱离对象返回的内容。

答案 1 :(得分:1)

我不确定它是否相关,因为C ++ 14最终没有std::optional。 Jonathan说,这个意图(尽管最初没有在标准中反映出来)一直是一个脱离的可选对象的散列返回一个未指定的值。

此意图反映在Fundamentals TS

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