C 17 的「if constexpr」僅限於模板函數
在C 17 中,「if constexpr」的引入了人們對其的興趣根據編譯時常數有條件地執行程式碼的能力。但是,嘗試在非模板化函數中使用它時會出現問題。
考慮以下程式碼:
<code class="cpp">#include <iostream> #include <type_traits> void print(auto value) { // Compile-time check if value is a pointer if constexpr (std::is_pointer_v<decltype(value)>) std::cout << "Ptr to " << *value << std::endl; else std::cout << "Ref to " << value << std::endl; } int main() { // Error when printing a non-pointer print(100); }</code>
雖然此程式碼在模板化函數中編譯時沒有錯誤,但它會失敗並顯示放置在非模板化函數(如print)時出現編譯錯誤。原因在於「if constexpr」的行為。
「if constexpr」旨在允許模板程式碼的條件編譯。在模板函數中,編譯器在編譯時推斷參數的類型,從而能夠根據類型選擇適當的程式碼路徑。在這種情況下,當 print 函數被模板化時,它可以在編譯時識別 value 是否為指標並執行相應的程式碼分支。
但是,在非模板化函數中,value 的類型是已知的僅在運行時,使「if constexpr」無效。編譯器將條件的兩個分支都視為可執行程式碼,當 value 為整數時嘗試取消引用 Ptr 中的值以進行分支時,會導致編譯錯誤。
要避免此問題,需要放置 " if constexpr" 在模板函數中或向非模板函數提供明確類型資訊以確保編譯時類型推導。
以上是為什麼我不能在 C 17 的非模板化函數中使用 `if constexpr`?的詳細內容。更多資訊請關注PHP中文網其他相關文章!