2013-10-02 9 views
7

od cppreference wspomina, że ​​std::hash specjalizuje się w std::optional, ale nie określa zachowania, gdy obiekt jest wyłączony. Mogę myśleć o różnych zachowań:Co to jest skrót od wyłączonego obiektu std :: optional <T>?

  • To może rzucić std::bad_optional_access, aby były zgodne z std::optional::value
  • To może wrócić ten sam hash dla każdego odłączonym std::optional<T>, w ten sposób 2 odłączony obiekt miałby taki sam hash.
  • Może zwróci std::optional<std::hash<std::optional<T>>>
+0

Ten ostatni jest zabawny, ale w rzeczywistości nie ma sensu: -S Dziwne, ale to nie jest określone. Z drugiej strony język nie jest jeszcze opublikowany. Jak działa Boost? –

+0

Zauważ, że 'opcjonalny' został usunięty z C++ 14. – Simple

+2

@ Simple To było? Czy zdarza Ci się mieć link do raportu z uzasadnieniem? Chciałbym wiedzieć, że – nijansen

Odpowiedz

6

C++ 14 cd że w [optional.hash]/3:

dla obiektu o typu optional<T> jeśli bool(o) == true, hash<optional<T>>()(o) oceni do tej samej wartości, co hash<T>()(*o).

Powiedziałbym, że nie jest określona funkcja powrotu funkcji mieszania dla wyłączonego obiektu.

+0

więc obliczanie skrótu 'opcjonalnego ' jest ** niezdefiniowane zachowanie**. – qdii

+3

@qdii, nieokreślony to nie to samo, co niezdefiniowane.Po wstawieniu elementu do domyślnie skonstruowanego 'std :: vector' pojemność wektora jest nieokreślona, ​​ponieważ może przyjąć dowolną wartość większą od zera, ale nie jest to niezdefiniowane zachowanie, aby użyć wektora. Jeśli 'hash >' miał klauzulę _Requires_ określającą warunek wstępny, zgodziłbym się, że jest nieokreślony, ale jak to jest, nie jestem pewien. Z pewnością nie sądzę, że zamierzone było niezdefiniowane zachowanie. –

+0

To jest teraz [LWG2333] (http://cplusplus.github.io/LWG/lwg-active.html#2333) i zostanie zaadresowane w bibliotece Library Fundamentals TS, która określa 'std :: experimental :: optional' –

1

Nie jestem pewien, czy jest to istotne, ponieważ C++ 14 ostatecznie nie ma wartości std::optional. Intencją (choć początkowo nie odzwierciedloną w standardzie) zawsze było to, że hash zwolnionego obiektu opcjonalnego zwraca nieokreśloną wartość, jak powiedział Jonathan.

Ta zamiar znajduje odzwierciedlenie w Fundamentals TS.

Chodzi o to, że implementacja Biblioteki Standardowej wybiera sposób, w jaki chce reprezentować odłączone optional<T> i sam ją dokumentuje. Może wybrać inną wartość dla różnych typów, a także inną wartość w trybie debugowania i zwolnienia.