非终止constexpr功能是否定义明确?

fre*_*low 12 c++ infinite-loop undefined-behavior constexpr c++14

请考虑以下代码:

constexpr unsigned f(unsigned x)
{
    while (x & 1) x *= 3;
    return x;
}

int main()
{
    char a[f(2)];
    char b[f(1)];
}
Run Code Online (Sandbox Code Playgroud)

如果不明显:对于奇数整数x,函数f永远不会终止.

当我用coliru上的clang编译上面的程序,b似乎是一个VLA,但不是a:

warning: variable length arrays are a C99 feature [-Wvla-extension]

char b[f(1)];
Run Code Online (Sandbox Code Playgroud)

是否存在明确定义的限制,编译器决定停止对常量表达式的求值?或者,对于符合标准的编译器来说,进入无限循环会是完美的吗?是否会f(1)产生UB?

Jam*_*nze 7

有许多的事情,这意味着一个表达式不是核心常量表达式

- 调用超出实现定义的递归限制的constexpr函数或constexpr构造函数;

(§5.19/ 2中的第五点.).所以限制是实现定义的.

  • 事实证明,C++ 14已将此更改为"超出实现定义限制的表达式",以涵盖非递归限制,在本例中为"在核心常量表达式中评估的完整表达式" (4认同)