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