The C++ standard is very specific about the effects of various constructs, and in particular you should always be aware of these categories of trouble:
未定义行为意味着绝对不会给出任何保证。该代码可以工作,或者它可以放火烧你的硬盘或 让恶魔从你鼻子里飞出来。就 C + + 语言而言,任何事情都有可能发生。实际上,这通常意味着您有一个不可恢复的错误。如果发生这种情况,你就不能真正相信你的应用程序中的 什么都行(因为这种未定义行为的一个影响可能就是搞乱了应用程序其余部分使用的内存)。它不需要是一致的,因此运行两次程序可能会得到不同的结果。这可能取决于月相,你所穿的衬衫的颜色,或者其他任何东西。
未指定的行为意味着程序必须做一些正常和一致的事情,但是 文件不需要这样做。
实现定义的行为类似于未指定的行为,但也必须由编译器编写器记录。这方面的一个例子是 reinterpret_cast的结果。usually,它只是改变指针的类型,而没有修改地址,但是映射实际上是实现定义的,所以编译器 可以映射到一个完全不同的地址,只要它记录了这个选择。另一个例子是 int 的大小。C + + 标准并不关心它是2、4还是8字节,但是编译器会记录 必须的
但所有这些问题的共同点是,最好避免这些问题。如果可能的话,坚持使用 C + + 标准本身100% 指定的行为。这样,你就可以保证移植性。
You often have to rely on some implementation-defined behavior as well. It may be unavoidable, but you should still pay attention to it, and be aware that you're relying on something that may change between different compilers.