sha*_*oth 0 c++ compiler-construction
让我们假装我的程序包含一个特定的构造,C++标准声明它是未指定的行为.这基本上意味着实现必须做一些合理的事情,但不允许记录它.但是,每次编译具有未指定行为的特定构造时是否需要生成相同的行为,或者是否允许在不同的编译中产生不同的行为?
未定义的行为怎么样?让我们根据标准假装我的程序包含一个UB结构.允许实现表现出任何行为.但是,同一编译器中相同程序的编译在同一环境中具有相同设置时,此行为是否会有所不同?换句话说,如果我在文件X.cpp中的第78行取消引用空指针,并且在这种情况下驱动器的实现格式是否意味着它将在重新编译程序后执行相同的操作?
问题是......我使用相同的编译器设置在相同的环境中使用相同的编译器编译相同的程序.构造声明是未指定的行为,未定义的行为会在每次编译时产生相同的行为,还是允许它们在编译之间有所不同?
如果它是未定义的行为,那么它本质上将会发生什么是未定义的,你不能在任何情况下依赖它是相同的.
另一方面,如果例如语言规范中存在歧义,则未指定的行为是由个别供应商决定如何实现的.这在编译和运行之间是一致的,但不一定在不同供应商之间.因此,例如,当您仅使用Visual Studio构建时依赖于未指定的行为,但如果您尝试将代码移植到gcc,它可能会失败或产生与您期望的不同的行为.