std :: type_info :: hash_code()唯一性和"应该"的含义

Ste*_*Lin 10 c++ rtti abi language-lawyer

它是否意味着保证相同的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),如果全球uniquing是在运行时完成,如果标准是试图表明这为目前还不清楚理想的实施策略与否.

Jer*_*fin 5

这个含义对我来说非常清楚:这不是一个绝对的要求,因为在某些情况下可能无法满足,但实施应该尽可能地产生独特的价值.

我注意到一般情况下哈希码也是如此 - 你试图产生唯一的值,但并不总是这样.

该标准包含许多不可执行的信息.相当多(但肯定不是全部)是显式Notes 的形式,但这并不意味着注释之外的所有非规范性都是缺陷.

编辑:如果有人想知道ISO关于如何编写标准的内容,他们会有一页指南.

  • @StephenLin:我同意cplusplus.com错误.它并不是特别准确.至少作为一般规则,cppreference.com似乎更可靠. (4认同)
  • @JerryCoffin嗯,显然它足以误导别人.不,它不是那么清楚,因为它实际上很可能保证一些前期成本的独特性.实际上有用的是知道这个前期成本是否由实现支付,因此用户可以利用它,但是看起来标准不是要求预付费用,而是让用户无法知道是否它已经支付(除了阅读ABI文档) (2认同)