静态 if 语句
Version >= C++ 17
if constexpr
语句可用于有条件地编译代码。条件必须是一个常量表达式。未选择的分支被*丢弃。*模板内的废弃语句未实例化。例如:
template<class T, class ... Rest>
void g(T &&p, Rest &&...rs)
{
// ... handle p
if constexpr (sizeof...(rs) > 0)
g(rs...); // never instantiated with an empty argument list
}
此外,不需要定义仅在废弃语句中使用的变量和函数,并且丢弃的 return
语句不用于函数返回类型推导。
if constexpr
与 #ifdef
不同。#ifdef
有条件地编译代码,但仅基于可在预处理时评估的条件。例如,#ifdef
不能用于有条件地编译代码,具体取决于模板参数的值。另一方面,if constexpr
不能用于丢弃语法无效的代码,而 #ifdef
可以。
if constexpr(false) {
foobar; // error; foobar has not been declared
std::vector<int> v("hello, world"); // error; no matching constructor
}