C ++中是否有完整的Implementation-Defined行为列表?

时间:2014-01-20 03:26:36

标签: c++ standards

我回复了对我的回答的评论:C job interview - casting and comparing并发现我无法找到C ++认为“实施定义的行为”的完整列表。我知道这类事情有3个类别:未定义的行为,实现定义的行为和未指定的行为;然而,似乎大多数讨论都围绕未定义的行为,并且当讨论实现定义的行为时,至多给出了一个例子。一般来说,我倾向于编写很多代码来捕获这个区域,我知道会发生什么样的行为;我仍然希望能够对其有效性发表评论。我还想抛弃那里,我认为操作社区中有很多误诊是未定义的,而实际上它们是由平台很好地定义的。

请注意,我对给定平台如何选择定义此类行为并不感兴趣,而是对所有行为的列表感兴趣,这些行为属于C ++标准定义的“实现定义”类别。< / p>

1 个答案:

答案 0 :(得分:10)

标准本身定义了实现定义行为的所有案例,draft C++ standard在末尾有一个Index of implementation-defined behavior,提供主题以及主题所针对的页面,例如:

  

time_get :: do_get_date,689

的其他格式      

对齐,76

     

对齐其他值,76

实际上,每个编译器都应该记录所有实现定义的行为以及它们如何处理它们。例如,此处为gcc's C++ Implementation-defined behavior sectiongcc's C Implementation-defined behavior。据我所知,C ++标准与 C99草案标准不同,为未指定未定义行为提供了参考。因此,您必须在文档中搜索 undefined 未指定以查找所有实例。

C99 draft standardAnnex J.1中的未指定未定义实现定义的行为提供了参考,{分别为{1}}和J.2

重要的是要注意,未定义的行为可以由实现定义,但是它们必须记录它。在您的具体示例中,它看起来确实违反了strict aliasing rules,但您使用 type-punning 的替代建议已明确定义,因为 C89