由于一致性语义存在混淆,因此这些是 C++ 的规则。C 使用完全不同的一致性模型。
未定义的行为是一个矛盾的术语,它意味着翻译者不是你的程序,可以随心所欲。这通常意味着它可以生成代码,这些代码也可以做任何它喜欢的事情(但这是一个推论)。如果标准说行为未定义,则文本实际上对用户没有意义,因为删除该文本不会改变标准对翻译人员的要求。
格式错误的程序意味着除非另有说明,否则翻译程序的行为是严格定义的:需要拒绝您的程序并发出诊断消息。这里的主要特例是单一定义规则,如果您违反了您的程序格式错误但不需要诊断的情况。
定义的实现对翻译器提出了一个要求,即它包含明确指定行为的文档。在这种特殊情况下,结果可能是未定义的行为,但必须明确说明。
未指定是一个愚蠢的术语,这意味着行为来自一个集合。从这个意义上说,良好定义只是一种特殊情况,其中允许的行为集仅包含一个元素。未指定不需要文档,因此在某种意义上它也意味着与没有文档定义的实现相同。
一般来说,C++ 标准不是语言标准,而是语言标准的模型。要生成实际标准,您必须插入各种参数。其中最容易识别的是实现定义的限制。
标准中有几个愚蠢的冲突,例如,一个合法的翻译器可以拒绝每个表面上好的 C++ 程序,因为你需要提供一个main()
函数,但翻译器只支持 1 个字符的标识符。这个问题可以通过QOI或实施质量的概念来解决。它基本上说,谁在乎,没有人会仅仅因为它符合要求而购买该编译器。
从技术上讲,指针指向不相关对象时的未指定性质operator <
可能意味着:您将获得某种结果,它是真或假,但您的程序不会崩溃,但这不是未指定的正确含义,因此是一个缺陷:未指定给标准编写者带来了记录允许行为集的负担,因为如果该集是开放的,那么它相当于未定义的行为。
我实际上提出std::less
了一些数据结构要求键完全排序但指针不完全排序的问题的解决方案operator <
。在大多数使用线性寻址less
的机器上与 相同<
,但在less
x86 处理器上的操作可能更昂贵。