如果C 17 中的constexpr 不適用於非模板化函數
簡介
C 17 標準引入了if constexpr 構造,它允許基於常數表達式的條件執行。但是,據觀察,如果 constexpr 在模板化函數和非模板化函數中使用時行為不同。
問題
考慮以下非模板化函數:
<code class="cpp">void print() { auto value = 100; if constexpr (std::is_pointer_v<decltype(value)>){ std::cout << "Ptr to " << *value << std::endl; // Error } else { std::cout << "Ref to " << value << std::endl; } }</code>
此程式碼會導致編譯錯誤,因為*value 對於推導的類型int無效。
答案
此行為是設計使然。在模板化函數中, if constexpr 可以避免實例化對於特定模板特化無效的分支。但是,在非模板化函數中,if constexpr 不會抑制未採用分支的編譯。
if constexpr 語句的兩個分支都會被解析和分析,即使未採用的分支無效。因此,在上面的程式碼中,編譯器將嘗試計算 int 類型的 *value,從而導致錯誤。
結論
理解這種區別很重要當使用 if constexpr 時。在非模板化函數中,它只能用於檢查保證對輸入參數的所有可能值都有效的常數表達式。
以上是為什麼 `if constexpr` 在非模板化 C 函數中不能如預期般運作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!