我回复了对我的回答的评论:C job interview - casting and comparing并发现我无法找到C ++认为“实施定义的行为”的完整列表。我知道这类事情有3个类别:未定义的行为,实现定义的行为和未指定的行为;然而,似乎大多数讨论都围绕未定义的行为,并且当讨论实现定义的行为时,至多给出了一个例子。一般来说,我倾向于编写很多代码来捕获这个区域,我知道会发生什么样的行为;我仍然希望能够对其有效性发表评论。我还想抛弃那里,我认为操作社区中有很多误诊是未定义的,而实际上它们是由平台很好地定义的。
请注意,我对给定平台如何选择定义此类行为并不感兴趣,而是对所有行为的列表感兴趣,这些行为属于C ++标准定义的“实现定义”类别。< / p>
答案 0 :(得分:10)
标准本身定义了实现定义行为的所有案例,draft C++ standard在末尾有一个Index of implementation-defined behavior
,提供主题以及主题所针对的页面,例如:
time_get :: do_get_date,689
的其他格式对齐,76
对齐其他值,76
实际上,每个编译器都应该记录所有实现定义的行为以及它们如何处理它们。例如,此处为gcc's C++ Implementation-defined behavior section和gcc's C Implementation-defined behavior。据我所知,C ++标准与 C99草案标准不同,为未指定或未定义行为提供了参考。因此,您必须在文档中搜索 undefined 和未指定以查找所有实例。
C99 draft standard为Annex J.1
中的未指定,未定义和实现定义的行为提供了参考,{分别为{1}}和J.2
。
重要的是要注意,未定义的行为可以由实现定义,但是它们必须记录它。在您的具体示例中,它看起来确实违反了strict aliasing rules,但您使用 type-punning 的替代建议已明确定义,因为 C89 。