在C ++ 11中,作为一个没有副作用的无限循环,以下程序是UB:
int main() {
while (true) {}
}
以下是UB吗?
void foo() {
foo();
}
int main() {
foo();
}
两个计划的标准引文都是理想的。
答案 0 :(得分:20)
这是UB,因为它的循环不是措辞,而是(1.10p24):
实现可能假设任何线程最终将执行以下操作之一:
- 终止,
- 调用库I / O函数,
- 访问或修改易失性对象,或
- 执行同步操作或原子操作。
这适用于两者,而不是其中一个C ++ 0x草案中较旧的公式。 (参见this question进行讨论)。
请注意,忽略这一点,如果递归超过嵌套递归函数调用数的实现限制,则很容易定义该行为。情况一直如此。
答案 1 :(得分:1)
我不认为标准说行为是未定义的,它只是说没有副作用的循环可能会被假定最终终止。
所以:
int main() {
while (true) {}
}
可能会终止或永久循环。
void foo() {
foo();
}
int main() {
foo();
}
也可能终止,永远循环,或者可能用完堆栈空间(如果编译器没有实现尾递归)。
我认为除了列出之外,我们都没有权利做任何其他事情,因此我认为这种行为完全没有定义"。