2013-10-02 78 views
7

This page from cppreference提到std::hash已經專門用於std::optional,但沒有指定當對象脫離時的行爲。我能想到的不同行爲:什麼是脫離std ::可選<T>對象的散列?

  • 它可以拋出一個std::bad_optional_access,要符合std::optional::value
  • 它可以返回相同的哈希值每脫開std::optional<T>,這樣2脫離對象將具有相同的哈希值。
  • 它可以返回一個std::optional<std::hash<std::optional<T>>>
+0

最後一個很有趣,但實際上沒有意義:-S奇怪,但沒有指定。然後,語言還沒有發佈。 Boost如何做到這一點? –

+0

請注意'可選'已從C++ 14中刪除。 – Simple

+2

@簡單它是?你有沒有理由鏈接到報告?我很想知道 – nijansen

回答

6

的C++ 14 CD在[optional.hash]/3表示:

對於對象optional<T>類型的o,如果bool(o) == truehash<optional<T>>()(o)應評價與hash<T>()(*o)的值相同。

所以我會說它沒有指定什麼哈希函數返回一個分離的對象。

+0

因此,計算「可選」的散列值是** undefined行爲**。 – qdii

+3

@qdii,未指定與undefined不一樣。將一個元素插入默認構造的std :: vector後,向量的容量是_unspecified_,因爲它可以取大於零的任何值,但是使用該向量不是未定義的行爲。如果'hash >'有一個_Requires_子句陳述了一個先決條件,我會同意它是未定義的,但是因爲我不確定。我當然不認爲未定義的行爲是有意的。 –

+0

現在是[LWG2333](http://cplusplus.github.io/LWG/lwg-active.html#2333),並將在圖書館基礎TS中加以說明,它指定了'std :: experimental :: optional' –

1

我不確定它是否相關,因爲C++ 14最終沒有std::optional。正如喬納森所說,意圖(儘管最初並沒有在標準中反映出來)一直是一個脫離可選對象的散列返回一個未指定的值。

這個意圖反映在Fundamentals TS

這個想法是,標準庫的實現選擇它想要如何表示一個分離的optional<T>並將其自身記錄下來。它可以爲不同的類型選擇不同的值,也可以在調試和釋放模式下選擇不同的值。

相關問題