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

时间:2014-03-05 17:01:59

标签: 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)];
}

如果不明显:对于奇数整数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吗?

1 个答案:

答案 0 :(得分:7)

有很多东西意味着表达式 不是核心常量表达式

  

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

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