静态 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
}