уникальность std :: type_info :: hash_code () и значение слова «должен»

Это должно быть гарантировано тем же 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) если глобальное удаление выполняется во время выполнения, и неясно, пытается ли стандарт предложить это в качестве идеальной стратегии реализации или нет.

10

Решение

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

Я хотел бы отметить, что то же самое относится и к хеш-кодам в целом — вы пытаетесь создать уникальные значения, но это не всегда возможно.

Стандарт содержит много информации, которая не подлежит исполнению. Совсем немного (но, конечно, не все) в форме явного Notes, но это не значит, что все ненормативное, что находится вне примечания, является дефектом.

Изменить: в случае, если кто-то хочет знать, что ISO говорит о том, как стандарты должны быть написаны, они имеют страница руководства.

5

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

Других решений пока нет …

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