#include
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不是常量表达式).
每个C11编译器是否强制拒绝该程序?如果foo(false)被更复杂的表达式所替代,该怎么办?
也许这与我的问题有关.据我所知,在本例中,编译器被允许推迟对constexpr(3)的实际评估,直到运行时为止.但是,如果constexpr是完整的,我发现很难相信编译器可以决定所有的constexpr是否会抛出异常(这意味着constexpr无效).