在没有诊断的情况下,保守函数中是否会出现显式指定的未定义行为

Rya*_*ing 2 c++ language-lawyer c++20

在这里剥离评论

3 [intro.defs],3.65 [defns.undef]

常量表达式 ([expr.const]) 的求值永远不会表现出在 [intro] 到 [cpp] 中明确指定为未定义的行为

不过,通读[expr.const],我并不清楚立即函数中的每个语句都被定义为常量表达式。

如果 consteval 函数中的代码尝试显式描述为 UB 的行为,那么编译器可以表现出 UB 吗?

consteval void f() {
  int x;
  int y;
  &x - &y;  // UB allowed? or diagnostic required?
}
Run Code Online (Sandbox Code Playgroud)

Bar*_*rry 6

如果 consteval 函数中的代码尝试显式描述为 UB 的行为,那么编译器可以表现出 UB 吗?

不。

我们这里有两条规则:

  • 对函数的(顶级)调用consteval必须是常量表达式(多年来,这条规则的拼写变得更加复杂,是我的错,抱歉)。
  • 在常量求值期间不允许有未定义的行为(这被明确排除 - 不允许评估“具有 [intro] 到 [cpp] 中指定的未定义行为的操作,不包括 [dcl.attr.assume] " ( [expr.const]/5.8 )。这是一长串不允许你做的事情之一。

因此,当您调用 时f(),它必须是一个常量表达式,这需要遵循[expr.const]/5中的所有规则。其中违反了其中的规定&x - &y。这f()不是一个核心常量表达式,这是一个强制性的诊断,因为它是一个consteval函数。该程序格式不正确。