这些可能应该在不同的问题中,但它们是相关的,所以......
为什么我们需要写作
constexpr
?鉴于一组限制,编译器不能评估代码以查看它是否满足constexpr
要求,并将其视为满足要求constexpr
吗?作为一个纯粹的文档关键字,我不确定它是否成立,因为我想不出我(其他人的constexpr
函数的用户)应该真正关心它是否是运行时的情况。这是我的逻辑:如果它是一个昂贵的函数,我认为作为一个好的做法,无论我是否给它编译时常量输入,我都应该这样对待它。这可能意味着在加载时间调用它并保存结果,而不是在执行的关键点调用它。原因是因为
constexpr
实际上并不能向我保证它首先不会在运行时执行——所以也许应该有一个新的/不同的机制来做到这一点。这些
constexpr
限制似乎将许多(如果不是大多数)函数排除在编译时评估之外,这在逻辑上可能是。我读过这至少部分(或可能全部?)以防止无限循环和挂起编译器。但是,如果这是原因,它是否合法?
对于使用给定输入的任何给定函数,编译器是否应该能够计算constexpr
它是否无限循环?这并不能解决任何输入的停止问题。函数的输入是编译时间常数和有限的,因此编译器只需检查有限输入集的无限循环:实际使用的输入。如果您编写编译时无限循环,它应该是一个常规的编译错误。constexpr