#include <exception>
constexpr bool foo(bool x)
{
return x ? true : throw std::exception();
}
int main()
{
// 1) must never be compiled
// static_assert(foo(false), "");
// 2) must always be compiled?
const bool x = foo(false);
// 3) must never compile?
constexpr bool y = foo(false);
return 0;
}
我确信 (1) 一定会导致编译错误。我很确定(2)不能在编译时被拒绝,尽管它会在运行时失败。
有趣的例子是 constexpr 变量 (3)。在这个简单的例子中,gcc 和 clang 实际上计算表达式,因此会拒绝程序。(错误消息:y 不是常量表达式)。
是否每个 C++11 编译器都被迫拒绝该程序?如果 foo(false) 被更复杂的表达式代替怎么办?
我很惊讶地发现 constexpr 不是图灵完备的,尽管这将是在规范更改之后: 基于 constexpr 的计算图灵完备吗?
也许这与我的问题有关。据我了解,允许编译器将本示例中 constexpr (3) 的实际评估推迟到运行时。但是如果 constexpr 是图灵完备的,我很难相信编译器可以为所有 constexpr 决定是否会抛出异常(这意味着 constexpr 无效)。