c – std :: type_info :: hash_code()的唯一性和“应该”的含义

是否要保证相同的std :: type_info :: hash_code()值意味着相同的类型?

Cplusplus.com似乎声称如此:

This function returns the same value for any two type_info objects that compare equal,and different values for distinct types that do not. [Emphasis mine]

Cppreference似乎声称:

Returns an unspecified value,which is identical for objects,referring to the same type. No other guarantees are given,in particular,the value can change between invocations of the same program. [Emphasis mine]

相关标准段落为:

§ p18.7.1 p7-8

size_t hash_code() const noexcept;

7 Returns: An unspecified value,except that within a single execution of the program,it shall return the same value for any two type_info objects which compare equal.

8 Remark: an implementation should return different values for two type_info objects which do not compare equal. [Emphasis mine]

应该在上述的上下文中“应该”的意思是什么?如果第8段是要求,那么看起来似乎不可能实现,除非运行时在程序中对所有符号名称进行某种全局定义,以确保缺少哈希冲突,这似乎是标准的相当大的负担执行实现,特别是对于一个名为hash_code()的函数. (Itanium实际上需要这个,但是它显然是超出标准的额外要求.)

如果“应该”并不意味着具有约束力,那么这个说法似乎是一个毫无意义的,而且是标准的缺陷,因为要求实现来尝试实现一个不能依赖的困难要求,没有任何价值,只会引起混淆和分裂.任何人知道为什么在那里?

编辑:也许“缺陷”太强了,但至少应该澄清一点可能的混乱,因为它显然是误导了至少一个参考网站,并且过分地误导了任何依赖它的人.此外,实际上可以满足要求(只要实现中支持的类型数量小于size_t的范围),如果在运行时完成全局唯一性,并且不清楚标准是否将此建议为理想的实施策略与否.

解决方法

这个意思对我来说很清楚:这不是一个绝对的要求,因为在某些情况下可能是不可能的,但实施应尽可能地产生独特的价值.

我会注意到,哈希码一般也是如此 – 你尝试产生独特的值,但并不总是可能的.

该标准包含大量不可执行的信息.相当一点(但绝对不是全部)是以明确的说明形式,但这并不意味着一个非规范性的外部注释是一个缺陷.

编辑:如果有人想知道ISO如何写标准,他们有一个page of guidelines.

相关文章

首先GDB是类unix系统下一个优秀的调试工具, 当然作为debug代...
1. C语言定义1个数组的时候, 必须同时指定它的长度.例如:int...
C++的auto关键字在C+⬑新标准出来之前基本...
const关键字是用于定义一个不该被改变的对象,它的作用是告诉...
文章浏览阅读315次。之前用C语言编过链表,这几天突然想用C+...
文章浏览阅读219次。碰到问题就要记录下来,防止遗忘吧。文章...