编译时constexpr错误,但在运行时没有开销

Dav*_*one 25 c++ constexpr c++11 c++14

有一个众所周知的技巧,constexpr通过执行以下操作来在函数求值中导致编译时错误:

constexpr int f(int x) {
    return (x != 0) ? x : throw std::logic_error("Oh no!");
}
Run Code Online (Sandbox Code Playgroud)

如果在constexpr上下文中使用该函数,则会出现编译时错误x == 0.但是,如果参数f不是constexpr,那么它将在运行时抛出异常x == 0,但由于性能原因,这可能并不总是需要.

类似于assert被保护的理论NDEBUG,是否有一种方法可以导致constexpr函数的编译时错误,但是在运行时没有做任何事情?

最后,constexprC++ 1y(C++ 14)中的宽松规则会改变什么吗?

Ric*_*ith 15

有没有办法使用constexpr函数导致编译时错误,但在运行时没有做任何事情?

您可以使用完全相同的技巧,但不使用throw-expression,而是使用不是常量表达式但在运行时执行所需操作的表达式.例如:

int runtime_fallback(int x) { return x; } // note, not constexpr
constexpr int f(int x) {
  return (x != 0) ? x : runtime_fallback(0);
}

constexpr int k1 = f(1); // ok
constexpr int k2 = f(0); // error, can't call 'runtime_fallback' in constant expression
int k3 = f(0);           // ok
Run Code Online (Sandbox Code Playgroud)

constexprC++ 1y(C++ 14)中的宽松规则会改变什么吗?

不在这个区域,没有.有些表达式在C++ 14中的常量表达式中有效,但在C++ 11中没有,但是throw-expression和非constexpr函数调用都不在该列表中.