【发布时间】:2013-09-18 16:02:01
【问题描述】:
这些可能应该在不同的问题中,但它们是相关的......
-
为什么我们需要写
constexpr?鉴于一组限制,编译器不能评估代码以查看它是否满足constexpr要求,如果满足则将其视为constexpr? 作为纯粹的文档关键字,我不确定它是否成立up 因为我想不出我(别人的constexpr函数的用户)应该真正关心它是否是运行时的情况。这是我的逻辑:如果它是一个昂贵的函数,我认为作为一个好的做法我应该这样对待它,无论我是否给它编译时常量输入。这可能意味着在加载时间调用它并保存结果,而不是在执行的关键点调用它。原因是因为
constexpr实际上并没有向我保证它不会在运行时首先执行——所以也许应该使用新的/不同的机制来做到这一点。 -
constexprrestrictions 似乎排除了许多(如果不是大多数) 函数在编译时评估,这在逻辑上是可能的。我读过这至少是部分(或全部?)以防止无限循环和挂起编译器。但是,如果这是 的原因,它合法吗?
编译器是否应该能够计算,对于使用给定输入的任何给定constexpr 函数,它是否无限循环?这不是解决halting problem的任何输入。 constexpr 函数的输入是编译时间常数和有限的,因此编译器只需检查有限输入集的无限循环:实际使用的输入。 如果你写了编译时无限循环,这应该是一个常规的编译错误。
【问题讨论】:
-
2) 由于编译器算法事先不知道您的输入和您的 constexpr 函数,因此这是编译器的停机问题。正是
-
停止问题正是:给定一个程序和该程序的输入确定该输入的程序执行是否停止。
-
"如果你写了一个编译时无限循环,这应该是一个常规的编译错误。"这就是问题所在,除了运行它之外,没有通用算法来确定它是否是一个无限循环。如果是这样的话,那需要无限的时间......
-
1) 编译器在编译时计算不同函数的能力可能因编译器而异。 constexpr 要求是一些共同点:程序员声明 constexpr 会强制编译器检查标准要求,即使该表达式实际上并未在代码中使用(例如,库编写者可能会专门为库用户提供该表达式)