Это должно быть гарантировано тем же std::type_info::hash_code()
значения подразумевают одни и те же типы?
Cplusplus.com кажется, утверждают так:
Эта функция возвращает одинаковое значение для любых двух объектов type_info, которые сравниваются равными, и разные значения для разных типов это не так. [Акцент мой]
Cppreference кажется, утверждают иначе:
Возвращает неопределенное значение, идентичное для объектов, относящихся к тому же типу. Других гарантий не дано, в частности, значение может меняться между вызовами одной и той же программы. [Акцент мой]
Соответствующие пункты стандартов:
§ с18.7.1 с7-8
size_t hash_code () const noexcept;
7 Возвращает: Неуказанное значение, за исключением того, что в течение одного выполнения программы оно должно возвращать одинаковое значение для любых двух объектов type_info, которые сравниваются равными.
8 Замечание: реализация должен вернуть разные значения для двух объектов type_info, которые не сравниваются одинаково. [Акцент мой]
Что значит «должен«Предполагается, что в контексте выше? Если параграф 8 должен быть требованием, то, кажется, невозможно выполнить, если среда выполнения не выполняет какой-то глобальный uniquing по всем именам символов в программе, чтобы гарантировать отсутствие коллизии хеша, которая кажется быть довольно большим бременем для стандарта навязывать реализации, особенно для функции, называемой hash_code()
, (Itanium действительно требует этого, но это явно дополнительное требование по сравнению со стандартом.)
Если «должен«не означает, что оно является обязательным, то это замечание представляется бессмысленным и является недостатком стандарта, так как требование к реализациям попытаться выполнить сложное требование, на которое в любом случае нельзя полагаться, не дает никакой ценности и только приводит к путанице и фрагментации. Кто-нибудь знает, почему это там?
РЕДАКТИРОВАТЬВозможно, слово «дефект» было слишком сильным, но, по крайней мере, это точка возможного замешательства, которую следует уточнить, поскольку она, по-видимому, ввела в заблуждение хотя бы один ссылочный сайт и транзитивно ввела в заблуждение всех, кто полагается на него. Кроме того, это на самом деле является возможно выполнить требование (при условии, что число поддерживаемых реализацией типов меньше диапазона size_t
) если глобальное удаление выполняется во время выполнения, и неясно, пытается ли стандарт предложить это в качестве идеальной стратегии реализации или нет.
Смысл выглядит для меня достаточно ясным: это не абсолютное требование, потому что при некоторых обстоятельствах его невозможно выполнить, но реализация должен попытаться произвести уникальные значения в максимально возможной степени.
Я хотел бы отметить, что то же самое относится и к хеш-кодам в целом — вы пытаетесь создать уникальные значения, но это не всегда возможно.
Стандарт содержит много информации, которая не подлежит исполнению. Совсем немного (но, конечно, не все) в форме явного Note
s, но это не значит, что все ненормативное, что находится вне примечания, является дефектом.
Изменить: в случае, если кто-то хочет знать, что ISO говорит о том, как стандарты должны быть написаны, они имеют страница руководства.
Других решений пока нет …