2013-10-02 12 views
7

This page da cppreference menziona che std::hash è stato specializzato per , ma non specifica il comportamento quando l'oggetto è disattivato. Mi vengono in mente diversi comportamenti:Qual è l'hash di un oggetto std :: facoltativo <T>?

  • Si potrebbe gettare un std::bad_optional_access, per essere coerenti con std::optional::value
  • Potrebbe restituire lo stesso hash per ogni disimpegnato std::optional<T>, questo oggetto disimpegnato modo 2 avrebbe lo stesso hash.
  • Potrebbe restituire un
+0

L'ultimo è divertente, ma in realtà non ha senso: -S strano, però, che questo non è specificato. Poi di nuovo, la lingua non è ancora stata pubblicata. Come fa Boost a farlo? –

+0

Si noti che 'opzionale' è stato rimosso da C++ 14. – Simple

+2

@Simple Era? Ti capita di avere un link al rapporto con logica? Mi piacerebbe sapere – nijansen

risposta

6

Il CD std::optional<std::hash<std::optional<T>>> C++ 14 detto in [optional.hash]/3:

Per un oggetto o di tipo optional<T>, se bool(o) == true, hash<optional<T>>()(o) deve valutare allo stesso valore di hash<T>()(*o).

Quindi direi che non è specificato cosa restituisce la funzione hash per un oggetto disimpegnato.

+0

quindi il calcolo dell'hash di un '' opzionale è ** non definito comportamento**. – qdii

+3

@qdii, non specificato non è lo stesso di non definito.Dopo aver inserito un elemento in un 'std :: vector' costruito in modo predefinito, la capacità del vettore è _unspecified_, perché potrebbe assumere qualsiasi valore maggiore di zero, ma non è un comportamento indefinito utilizzare il vettore. Se 'hash >' aveva una clausola _Requires_ che dichiarava una precondizione, sarei d'accordo che non è definito, ma come è non ne sono sicuro. Sicuramente non penso che si intendesse un comportamento indefinito. –

+0

Questo è ora [LWG2333] (http://cplusplus.github.io/LWG/lwg-active.html#2333) e sarà indirizzato in TS Fundamentals della libreria che specifica 'std :: experimental :: optional' –

1

Non sono sicuro che sia più pertinente, in quanto C++ 14 non ha lo std::optional alla fine. L'intenzione (anche se non si riflette inizialmente nello standard) è sempre stata che l'hash di un oggetto opzionale disimpegnato restituisce un valore non specificato, come ha detto Jonathan.

Questo intento si riflette nello Fundamentals TS.

L'idea è che l'implementazione della Libreria standard scelga come vuole rappresentare uno sbloccato optional<T> e lo documenti esso stesso. Può scegliere un valore diverso per tipi diversi e anche un diverso valore in modalità debug e release.

Problemi correlati