constexpr函数不终止会有明确定义吗?

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永远不会终止。

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

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

char b[f(1)];

编译器是否有定义明确的极限来决定停止对常量表达式的求值?或者符合规范的编译器进入无限循环也完全没问题?f(1)会导致未定义行为吗?


1
备选标题:“constexpr解决停机问题吗?”(开玩笑,当然不是) - stefan
1个回答

8

有一些因素表明一个表达式不是核心常量表达式

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

(§5.19/2.的第五点)。因此限制是由实现定义的。


4
事实证明,C++14已将此更改为只是“超过实现定义限制的表达式”,以涵盖非递归限制,本例中为“在核心常量表达式中评估的完整表达式”。 - Johannes Schaub - litb
请参阅附录B:“在核心常量表达式[1 048 576]中评估的完整表达式”。 - Sebastian Redl
@JohannesSchaub-litb 是的。我开始查找,然后就迷失了原始表达式。这是一个很好的问题:必须有一些限制,否则编译器永远不会停止。 - James Kanze
现在正确的引号在注释中,但它们应该在答案中,以便我们可以将注释删除为过时。 - Shafik Yaghmour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接