7

cppreference のこのページstd::hashには、に特化した言及std::optionalがありますが、オブジェクトが解放されたときの動作は指定されていません。私はさまざまな行動を考えることができます:

  • std::bad_optional_access一貫性を保つために、をスローする可能性がありますstd::optional::value
  • 解放されたすべての に対して同じハッシュを返すことができstd::optional<T>ます。このようにして、解放された 2 つのオブジェクトは同じハッシュを持つことになります。
  • それは返すことができますstd::optional<std::hash<std::optional<T>>>
4

2 に答える 2

6

[optional.hash]/3 で述べた C++14 CD:

oタイプのオブジェクトの場合、optional<T>ifは と同じ値に評価されます。bool(o) == truehash<optional<T>>()(o)hash<T>()(*o)

したがって、解放されたオブジェクトに対してハッシュ関数が何を返すかは不明です。

于 2013-10-02T10:36:39.247 に答える
1

std::optionalC++14 には最終的に関連性がないため、それがもはや関連性があるかどうかはわかりません。Jonathan が言ったように、意図は (最初は標準に反映されていませんでしたが) 解放されたオプション オブジェクトのハッシュが未指定の値を返すことでした。

この意図は、 Fundamentals TSに反映されています。

アイデアは、標準ライブラリの実装が、解放されたものをどのように表現したいかを選択し、optional<T>それ自体を文書化するというものです。タイプごとに異なる値を選択でき、デバッグ モードとリリース モードでも異なる値を選択できます。

于 2015-12-03T09:18:07.647 に答える