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?
有许多的事情,这意味着一个表达式不是核心常量表达式是
- 调用超出实现定义的递归限制的
constexpr
函数或constexpr
构造函数;
(§5.19/ 2中的第五点.).所以限制是实现定义的.
归档时间: |
|
查看次数: |
198 次 |
最近记录: |