qdi*_*dii 6 c++ undefined-behavior
来自msdn博客的这篇文章的一个例子让我做了自动收报机:
它说这个功能:
void unwitting(bool door_is_open)
{
if (door_is_open) {
walk_on_in();
} else {
ring_bell();
// wait for the door to open using the fallback value
fallback = value_or_fallback(nullptr);
wait_for_door_to_open(fallback);
}
}
Run Code Online (Sandbox Code Playgroud)
可以优化到这一个:
void unwitting(bool door_is_open)
{
walk_on_in();
}
Run Code Online (Sandbox Code Playgroud)
因为调用value_or_fallback(nullptr)
是未定义的行为(这在本文前面已经证明).
现在我不明白的是:运行时只有在到达该行时才进入未定义的行为.在运行时进入UB之前,第一段的所有可观察效果是否都应该被解决,这不应该发生在之前/之后发生的概念吗?
推理中有一个流程.
当编译器编写者说:我们使用Undefined Behavior来优化程序时,有两种不同的解释:
因此,在您的情况下:
nullptr
是未定义的行为value_or_fallback(nullptr)
是未定义的行为else
分支是Undefined Behaviordoor_is_open
存在false
是未定义行为并且由于未发生未定义的行为(程序员发誓她将遵循使用条款),door_is_open
因此必然true
且编译器可以忽略else
分支.
(*)我有点恼火,Raymond Chen实际上是这样制定的......
归档时间: |
|
查看次数: |
711 次 |
最近记录: |