1. 程式人生 > >C++17嚐鮮:編譯期 if 語句

C++17嚐鮮:編譯期 if 語句

Constexpr If(編譯期 if 語句)

以 if constexpr 打頭的 if 語句被稱為 Constexpr If。
Constexpr If 是C++17所引入的新的語法特性。它為C++語言提供了在編譯期處理條件分歧的功能。

執行期 if 語句 預處理 if 語句 編譯期 if 語句
if (condition) {
statement;
} else if (condition) {
statement;
} else {
statement;
}
if condition
statement;
#elif condition
statement;
#else
statement;
#endif
if constexpr (condition) {
statement;
} else if constexpr (condition) {
statement;
} else {
statement;
}

* 與執行期 if 語句有所不同,編譯期 if 語句中的判斷條件必須是編譯期常量。
* 與預處理期 if 語句有所不同,編譯期 if 語句中被丟棄的分支仍然需要進行語法檢查。

template <typename T>
auto get_value(T t) {
    if constexpr (std::is_pointer_v<T>)
        return
*t; // deduces return type to int for T = int* else return t; // deduces return type to int for T = int }
  • std::is_pointer_v是一個編譯期的函式,判斷型別引數 T 是否指標型別,返回布林值。
  • std::is_pointer_v 的返回值是一個編譯器常量,符合編譯期 if 語句的要求。
  • get_value函式在編譯期檢查引數 t 的型別 T,如果 T 是指標型別,就返回 *t 否則返回 t 自身。
  • 由於 get_value 函式可能返回兩種不同的型別,因此返回值型別必須用 auto,讓編譯器自行推導。