实现定义的行为和未定义的行为
C++标准非常详细地说明了各种构造的影响,尤其是您应该始终注意这些类别的问题
未定义的行为意味着绝对不会给出任何保证。代码可能会工作,也可能会烧毁你的硬盘或make demons fly out your nose。就C++语言而言,任何事情都有可能发生。实际上,这通常意味着你有一个不可恢复的bug。如果发生这种情况,你就不能真正信任你的应用程序的任何东西(因为这种未定义的行为的影响之一可能只是弄乱了你的应用程序的其余部分使用的内存)。不需要保持一致,所以运行两次程序可能会产生不同的结果。这可能取决于月相,你穿的衬衫的颜色,或者绝对任何else.Unspecified行为意味着程序必须做一些理智和一致的事情,但它不需要记录这一点。Implementation-defined的行为类似于unspecified,但也必须由编译器编写者记录下来。这方面的一个例子是reinterpret_cast的结果。通常,它只是简单地更改指针的类型,而不修改地址,但映射实际上是实现定义的,因此编译器可以映射到完全不同的地址,只要它记录了这种选择。另一个例子是int的大小。C++标准并不关心它是2、4还是8字节,但是它必须由编译器记录下来
但所有这些问题的共同之处在于,最好避免它们。在可能的情况下,坚持100%由C++标准本身指定的行为。这样,您就可以保证可移植性。
您通常还必须依赖于一些实现定义的行为。这可能是不可避免的,但你仍然应该注意它,并意识到你所依赖的东西在不同的编译器之间可能会发生变化。
另一方面,未定义的行为应该避免always。一般来说,你应该假设它会让你的程序以某种方式爆炸。