Эта страница из ссылки упоминает, что std::hash
был специализирован для std::optional
, но не определяет поведение, когда объект отключен. Я могу думать о разных видах поведения:
std::bad_optional_access
, чтобы соответствовать std::optional::value
std::optional<T>
Таким образом, 2 отключенных объекта будут иметь одинаковый хеш.std::optional<std::hash<std::optional<T>>>
Компакт-диск C ++ 14 сказал в [option.hash] / 3:
Для объекта
o
типаoptional<T>
, еслиbool(o) == true
,hash<optional<T>>()(o)
оценивать до того же значения, что иhash<T>()(*o)
,
Поэтому я бы сказал, что неизвестно, что возвращает хеш-функция для отключенного объекта.
Я не уверен, что это актуально больше, поскольку C ++ 14 не имеет std::optional
в конечном счете. Намерение (хотя изначально оно не отражалось в стандарте) всегда заключалось в том, чтобы хэш отключенного необязательного объекта возвращал неопределенное значение, как сказал Джонатан.
Это намерение отражено в Основы ТС.
Идея состоит в том, что реализация Стандартной библиотеки выбирает способ представления отключенного optional<T>
и документирует это сам. Он может выбрать другое значение для разных типов, а также другое значение в режиме отладки и выпуска.