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

qdi*_*dii 7 c++ hash standard-library optional c++14

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

  • 它可以抛出一个std::bad_optional_access,与之相符std::optional::value
  • 它可以为每个std::optional<T>脱离对象返回相同的哈希值,这样2个脱离对象将具有相同的哈希值.
  • 它可以返回一个 std::optional<std::hash<std::optional<T>>>

Jon*_*ely 6

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

对于o类型的对象optional<T>,if bool(o) == true,hash<optional<T>>()(o)将评估为与...相同的值hash<T>()(*o).

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

  • @qdii,未指定与undefined不同.将元素插入到默认构造的`std :: vector`后,向量的容量为_unspecified_,因为它可以取任何大于零的值,但使用向量并不是未定义的行为.如果`hash <optional <T >>`有一个_Requires_子句陈述一个先决条件我会同意它是未定义的,但因为它是我不确定.我当然不认为未定义的行为是有意的. (4认同)