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
函数的编译时错误,但是在运行时没有做任何事情?
最后,constexpr
C++ 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)
constexpr
C++ 1y(C++ 14)中的宽松规则会改变什么吗?
不在这个区域,没有.有些表达式在C++ 14中的常量表达式中有效,但在C++ 11中没有,但是throw-expression和非constexpr
函数调用都不在该列表中.
归档时间: |
|
查看次数: |
4695 次 |
最近记录: |