为什么不允许在constexpr函数中转到?

时间:2017-07-23 15:06:10

标签: c++ c++14 language-lawyer constexpr goto

C ++ 14规定了constexpr函数中您可以做什么和不能做什么的规则。其中一些(没有asm,没有静态变量)似乎很合理。但是标准也禁止在goto函数中使用constexpr,即使它允许其他控制流机制。 这种区别背后的原因是什么? 我以为我们过去了“ goto很难编译器”。

2 个答案:

答案 0 :(得分:15)

我的理解是希望在C ++ 14中获得轻松的constexpr语义。放松的许多限制很简单,但有些更具争议性或难度,或者[插入你选择的形容词]。为了能够使用constexpr而不是放松goto,我们决定只发布主要变化并推迟其余部分。这似乎是一个非常合理的选择,因为C ++ 14中的constexpr比C ++ 11中的constexpr强大得多,而且不能使用goto是一个相当小的选择缺席,考虑所有事情。

尽管如此,肯定存在这样的观点:在goto上下文中constexpr是有用且可能的。事实上,放宽constexpr的{​​{3}}允许它。所以可能只需要有人想要写一个提议来添加它。那个人可能是你!两年前在initial proposal显然是Ville Voutilainen,其特色是与这个问题相关的段落:

  

有一个未经证实的传闻,根据这个传闻,在常量表达式中禁止goto更多是出于品味原因而不是技术原因,这意味着在常量表达式中支持goto并不是特别难以实现。我不能说这对于一般的实现是否正确。

这篇文章的接收情况好坏参半,但现在我们有了constexpr lambdas,也许它需要重新审视。 那个有人可能是你!

答案 1 :(得分:0)

在生成任何可执行代码之前,预期

constexpr将由编译器的前端在某种伪解释模式下或在单次传递中构建的抽象语法树上进行评估。我们知道goto可能会跳到函数末尾的某个部分,但尚未进行评估。因此,正确连接调用和执行goto会强制在多个传递中构建AST,并且在树中的节点之间跳出顺序仍然是一个混乱的操作,可能会破坏某些状态。所以这样的结构不值得麻烦。

相关问题