请考虑以下代码:
constexpr unsigned f(unsigned x)
{
while (x & 1) x *= 3;
return x;
}
int main()
{
char a[f(2)];
char b[f(1)];
}
如果不明显:对于奇数整数x
,函数f
永远不会终止。
当我编译上述程序with clang on coliru时,b
似乎是VLA,而不是a
:
warning: variable length arrays are a C99 feature [-Wvla-extension]
char b[f(1)];
是否存在明确定义的限制,编译器决定停止评估常量表达式?或者,对于符合标准的编译器来说,进入无限循环会是完美的吗? f(1)
会产生UB吗?
答案 0 :(得分:7)
有很多东西意味着表达式 不是核心常量表达式是
- 调用超出实现定义的递归限制的
constexpr
函数或constexpr
构造函数;
(§5.19/ 2中的第五点。)。所以限制是实施 定义