当 X 不成立时,“实现可能假设 X”意味着未定义的行为?

for*_*818 3 c++ undefined-behavior language-lawyer

最近有人试图说服我cppreference是错误的,因为它说没有副作用的无限循环将是未定义的行为。与无限循环是否未定义相关的一个问题是无限循环与无限递归。两者都是未定义的吗?。接受的答案引用了标准并得出结论:是的,没有副作用的无限循环是未定义的行为。

其他相关问题有:

相关引用是([basic.progress]p1):

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

  • 终止,
  • 调用库 I/O 函数,
  • 通过易失性左值执行访问,或者
  • 执行同步操作或原子操作。

当标准说“实现可能假设 X”时,这种措辞是否意味着包含“非 X”的代码未定义?

(在这个例子中,这意味着egfor (;;);是未定义的,但我很好奇该措辞的一般含义)

for*_*818 7

未定义的行为定义为:intro.defs

本文档没有提出要求的行为

对于这个问题,这意味着:实现可能假设 X 始终成立。当 X 不成立时,该标准对实现没有强加任何要求(因为无论如何它总是成立)。没有副作用的无限循环是未定义的。

浏览标准时,我发现了“可能假设”措辞的另一个例子。在[优先级.队列].1中

[...]库假设函数或函数对象定义了严格的弱排序(28.7)。

使用带有未定义严格弱排序的优先级队列的比较器是未定义的。