靜態 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
}