是否可以保证相同的std::type_info::hash_code()
值意味着相同的类型?
Cplusplus.com似乎声称如此:
此函数为任何两个比较相等的type_info对象返回相同的值,而不同类型的值则返回相同的值。 [强调我的]
Cppreference似乎另有说法:
返回一个未指定的值,对于对象,它引用相同的类型。 没有给出其他保证,特别是,值可以在同一程序的调用之间更改。 [强调我的]
相关标准段落是:
§p18.7.1p7-8
size_t hash_code()const noexcept;
7返回:一个未指定的值,除了在程序的单次执行中,它应为任何两个比较相等的type_info对象返回相同的值。
8备注:实现应该为两个不比较相等的type_info对象返回不同的值。 [强调我的]
“应该”的含义应该在上面的上下文中?如果段落8是一个要求,那么似乎不可能实现,除非运行时对程序中的所有符号名称进行某种全局统一以确保缺少哈希冲突,这似乎是标准的一个相当大的负担强加于实现,特别是对于一个名为hash_code()
的函数。 (Itanium实际上需要这个,但它显然是高于标准的额外要求。)
如果“ ”并不意味着具有约束力,那么这句话似乎是毫无意义的,也就是标准中的缺陷,因为要求实现尝试满足不能满足的困难要求无论如何,依赖提供没有价值,只会引起混乱和分裂。有人知道为什么会这样吗?
编辑:也许“缺陷”过于强烈,但至少它是一个可能混淆的点,应该澄清,因为它显然误导了至少一个参考网站并且过往误导了任何依赖的人之上。此外,如果在运行时完成全局唯一操作,它实际上 可以满足要求(只要实现支持的类型数小于size_t
的范围),并且目前还不清楚标准是否试图将此作为理想的实施策略。
答案 0 :(得分:5)
这个含义对我来说非常清楚:这不是绝对的要求,因为在某些情况下可能无法满足,但实现应该尝试尽可能地生成唯一值。
我注意到哈希码一般也是如此 - 你试图产生唯一的值,但并不总是可行。
该标准包含批次不可强制执行的信息。相当多(但肯定不是全部)是明确的Note
s形式,但这并不意味着注释之外的所有非规范性都是缺陷。
编辑:如果有人想知道ISO应该如何编写标准,他们会有page of guidelines。