考虑以下代码:
constexpr unsigned f(unsigned x)
{
while (x & 1) x *= 3;
return x;
}
int main()
{
char a[f(2)];
char b[f(1)];
}
很明显:对于奇数整数x
,函数f
永远不会终止。
当我使用clang在coliru上编译上面的程序时,b
似乎是VLA,但a
不是:
warning: variable length arrays are a C99 feature [-Wvla-extension]
char b[f(1)];
编译器是否有定义明确的极限来决定停止对常量表达式的求值?或者符合规范的编译器进入无限循环也完全没问题?f(1)
会导致未定义行为吗?