C 17 的「if constexpr」僅限於模板函數
在C 17 中,「if constexpr」的引入引發了人們對其的興趣根據編譯時常數有條件地執行程式碼的能力。但是,嘗試在非模板化函數中使用它時會出現問題。
考慮以下程式碼:
#include
#include
void print(auto value)
{
// Compile-time check if value is a pointer
if constexpr (std::is_pointer_v)
std::cout 雖然此程式碼在模板化函數中編譯時沒有錯誤,但當放置在 print 等非模板化函數中時,它會失敗並出現編譯錯誤。原因在於「if constexpr」的行為。
“if constexpr”旨在允許模板程式碼的條件編譯。在模板函數中,編譯器在編譯時推斷參數的類型,從而能夠根據類型選擇適當的程式碼路徑。這種情況下,當 print 函數被模板化時,它可以在編譯時識別 value 是否為指標並執行對應的程式碼分支。
但是,在非模板化函數中,value 的型別是已知的僅在執行時,使「if constexpr」無效。編譯器將條件的兩個分支視為可執行程式碼,當 value 為整數時嘗試取消引用 Ptr 中的值以進行分支時,會導致編譯錯誤。
為了避免此問題,有必要放置 " if constexpr" 在模板函數中或向非模板函數提供明確類型資訊以確保編譯時類型推導。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3