This page提到std::hash
已专门用于std::optional
,但未指定对象脱离时的行为。我可以想到不同的行为:
std::bad_optional_access
,与std::optional::value
std::optional<T>
返回相同的哈希值,这样2个脱离对象就会有相同的哈希值。std::optional<std::hash<std::optional<T>>>
答案 0 :(得分:6)
C ++ 14 CD在[optional.hash] / 3中说:
对于
o
类型的对象optional<T>
,如果bool(o) == true
,hash<optional<T>>()(o)
将评估为与hash<T>()(*o)
相同的值。
所以我会说它没有指定哈希函数为一个脱离对象返回的内容。
答案 1 :(得分:1)
我不确定它是否相关,因为C ++ 14最终没有std::optional
。 Jonathan说,这个意图(尽管最初没有在标准中反映出来)一直是一个脱离的可选对象的散列返回一个未指定的值。
此意图反映在Fundamentals TS。
中这个想法是标准库的实现选择它如何表示一个脱离的optional<T>
并自己记录它。它可以为不同类型选择不同的值,在调试和释放模式下也可以选择不同的值。