Что такое хеш отключенного std :: option & lt; T & gt; объект?

Эта страница из ссылки упоминает, что std::hash был специализирован для std::optional, но не определяет поведение, когда объект отключен. Я могу думать о разных видах поведения:

  • Это может бросить std::bad_optional_access, чтобы соответствовать std::optional::value
  • Он может вернуть один и тот же хеш для каждого отключенного std::optional<T>Таким образом, 2 отключенных объекта будут иметь одинаковый хеш.
  • Это может вернуть std::optional<std::hash<std::optional<T>>>

7

Решение

Компакт-диск C ++ 14 сказал в [option.hash] / 3:

Для объекта o типа optional<T>, если bool(o) == true, hash<optional<T>>()(o) оценивать до того же значения, что и hash<T>()(*o),

Поэтому я бы сказал, что неизвестно, что возвращает хеш-функция для отключенного объекта.

6

Другие решения

Я не уверен, что это актуально больше, поскольку C ++ 14 не имеет std::optional в конечном счете. Намерение (хотя изначально оно не отражалось в стандарте) всегда заключалось в том, чтобы хэш отключенного необязательного объекта возвращал неопределенное значение, как сказал Джонатан.

Это намерение отражено в Основы ТС.

Идея состоит в том, что реализация Стандартной библиотеки выбирает способ представления отключенного optional<T> и документирует это сам. Он может выбрать другое значение для разных типов, а также другое значение в режиме отладки и выпуска.

1

По вопросам рекламы [email protected]