导致时间旅行的未定义行为

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之前,第一段的所有可观察效果是否都应该被解决,这不应该发生在之前/之后发生的概念吗?

Mat*_* M. 7

推理中有一个流程.

当编译器编写者说:我们使用Undefined Behavior来优化程序时,有两种不同的解释:

  • 大多数人听到:我们识别未定义的行为,并决定我们可以做任何我们想做的事情(*)
  • 编译器编写器意味着:我们假设未发生未定义的行为

因此,在您的情况下:

  • 取消引用a nullptr是未定义的行为
  • 因此执行value_or_fallback(nullptr)是未定义的行为
  • 因此执行else分支是Undefined Behavior
  • 因而door_is_open存在false是未定义行为

并且由于未发生未定义的行为(程序员发誓她将遵循使用条款),door_is_open因此必然true且编译器可以忽略else分支.

(*)我有点恼火,Raymond Chen实际上是这样制定的......

  • @qdii:未指定的行为或实现定义的行为是的。未定义的行为是被禁止的。 (3认同)
  • @ 18446744073709551615"在一个平台上可能是这个,而在另一个平台上可能就是这个".他们绝对不会这么说.欢迎您尝试查找报价. (2认同)