在C 17 中的非模板化函數中使用「If constexpr」時出錯
在C 17 中,「if constex」語句允許基於常數表達式有條件地評估和編譯程式碼。但是,此功能在非模板化函數中使用時有限制。
程式碼:
<code class="cpp">#include <iostream> #include <type_traits> void print(auto value) { if constexpr (std::is_pointer_v<decltype(value)>) std::cout << "Ptr to " << *value << std::endl; else std::cout << "Ref to " << value << std::endl; }</code>
問題:
當「if constexpr」在非模板化函數中使用時,如上所示,嘗試取消引用非指標值時會發生編譯錯誤。出現此錯誤的原因是,與模板化函數不同,非模板化函數中的「if constexpr」不會阻止編譯未採用的程式碼路徑。
說明:
在模板化函數中,「if constexpr」允許根據模板參數的值有條件地編譯程式碼。在這種情況下,編譯器可以在編譯時確定模板對於給定的專業化是否有效,並且僅實例化必要的程式碼路徑。
但是,在非模板化函數中,「if constexpr」僅充當運行時的條件語句。編譯器仍然會分析條件語句的兩個分支,如果未採取的分支中有任何程式碼無效,則會發生編譯錯誤。
解決方案:
為了避免此錯誤,請僅在模板化函數或非模板化函數中使用“if constexpr”,其中類型在編譯時已知,並且保證對條件語句的兩個分支都有效。
以上是為什麼「if constexpr」會導致 C 17 中的非模板化函數出現編譯錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!