C++ 是一个从不终止有效C++;节目?

C++ 是一个从不终止有效C++;节目?,c++,language-lawyer,undefined-behavior,C++,Language Lawyer,Undefined Behavior,是否需要终止程序?换句话说,是一个永远运行在技术上未定义行为的程序吗?注意,这与空循环无关。谈论永远做“东西”(即可观察的行为)的程序 例如,类似这样的事情: int main() { while (true) { try { get_input(); // calls IO process(); put_output(); // calls IO, has observabl

是否需要终止程序?换句话说,是一个永远运行在技术上未定义行为的程序吗?注意,这与空循环无关。谈论永远做“东西”(即可观察的行为)的程序

例如,类似这样的事情:

int main()
{
    while (true)
    {
        try
        {
            get_input(); // calls IO
            process();
            put_output(); // calls IO, has observable behavior

            // never break, exit, terminate, etc
        } catch(...)
        {
            // ignore all exceptions
            // don't (re)throw
            // never go out of loop
        }
    }
}
这更像是一个学术问题,因为根据经验,所有sane编译器都会为上述类型的程序生成预期的代码(当然,假设没有其他UB源代码)。是的,当然有很多程序永远不会终止(操作系统、嵌入式、服务器)。然而,标准有时是古怪的,因此这个问题


切向:许多(某些?)对“算法”的定义要求算法必须终止,即一系列从未终止的操作不被视为算法


切向的。停止问题表明,不可能存在一种算法来确定任意程序是否完成输入。然而,对于这个特殊的程序,由于没有导致脱离main的分支,编译器可以很容易地确定程序将永远不会结束。但这并不重要,因为问题是语言律师。

是的。从

实现可能假设任何线程最终都会执行一个任务 其中:

  • 终止
  • 调用库I/O函数
  • 通过易失性glvalue执行访问,或
  • 执行同步操作或原子操作
[注意:这是为了允许编译器转换,例如删除 空循环,即使无法证明终止。-结束注释]


< C++中没有任何东西要求程序或任何给定线程终止。最接近这一点的是

实现可能假设任何线程最终将执行以下操作之一:

  • 终止
  • 调用库I/O函数
  • 通过易失性glvalue执行访问,或
  • 执行同步操作或原子操作
[ 注意:这是为了允许编译器转换,例如删除空循环,即使终止无法验证。 — 尾注 ]


只要最终存在一些可观察的行为,或者只要它将所有时间都花在I/O操作或另一个阻塞库调用上,这就不适用,并且程序是有效的(假设它满足所有其他有效性标准).

我相信一点说明程序执行I/O是可取的。因此,只要OPs示例“调用库I/O函数”中的
get\u input
put\u output
函数程序应该是有效的,即使它没有终止?@Someprogrammerdude或访问一个易失性或原子值,是的,当没有当前内存模型时,对c++11之前的标准表示怀疑。
编译器不知道
-这是无关的。从语言层的角度来看,编译器可能知道也可能不知道-问题是如果它是有效的,在任何情况下,“一个I/O操作或另一个阻塞库调用”-标准非常明确,只列出I/O操作。为什么要添加“或另一个阻塞库调用”?而且,该I/O操作已经包含在您以前的“一些可观察的行为”中。@MSalters
std::mutex::lock()
是一个库调用,它是一个同步操作,属于第四个项目。因此,只提到I/O调用并不是真的。如果它停留在输入上,但从未得到任何调用,那么这是否算是可观察到的是一个有争议的问题。注释不是用于扩展讨论的;此对话已经过讨论。