10

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

Cplusplus.com似乎声称是这样的:

此函数为比较相等的任何两个 type_info 对象返回相同的值,而对于不相等的不同类型返回不同的值[强调我的]

Cppreference似乎另有说法:

返回一个未指定的值,对于对象来说是相同的,指的是相同的类型。没有给出其他保证,特别是在同一程序的调用之间,值可能会发生变化。[强调我的]

相关标准段落为:

§ p18.7.1 p7-8

size_t hash_code() const noexcept;

7 返回:一个未指定的值,除了在程序的单次执行中,它应为任何两个比较相等的 type_info 对象返回相同的值。

8 备注:一个实现应该为两个比较不相等的 type_info 对象返回不同的值。[强调我的]

“应该”在上面的上下文中应该是什么意思?如果第 8 段是一个要求,那么除非运行时对程序中的所有符号名称进行某种全局唯一化以确保没有哈希冲突,否则似乎不可能实现,这对于标准来说似乎是一个相当大的负担强加于实现,特别是对于一个名为hash_code(). (安腾实际上需要这个,但它显然是超出标准的额外要求。)

如果“应该”不具有约束力,那么这句话似乎是毫无意义的,也是标准中的缺陷,因为要求实现尝试满足无论如何都不能依赖的困难要求没有任何价值,只会引起混乱和碎片化。有谁知道它为什么在那里?

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

4

1 回答 1

5

The meaning looks pretty clear to me: it's not an absolute requirement because it may be impossible to meet under some circumstances, but the implementation should attempt to produce unique values to the extent possible.

I'd note that the same is true of hash codes in general -- you try to produce values that are unique, but it's not always possible.

The standard contains a lot of information that's not enforceable. Quite a bit (but certainly not all) is in the form of explicit Notes, but that doesn't mean everything non-normative outside a Note is a defect.

Edit: in case anybody wants to know what the ISO says about how standards should be written, they have a page of guidelines.

于 2013-04-27T14:33:44.283 回答