簡介
C 17 引入了if constexpr關鍵字,允許基於編譯時常數的條件編譯。但是,在非模板化函數中使用 if constexpr 時,可能會發生意外錯誤。本文探討了這些問題並提供了解決方案。
程式碼範例
考慮以下程式碼:
<code class="cpp">#include <iostream> #include <type_traits> int main() { 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; }
編譯錯誤
編譯錯誤main.cpp:8:32: error: invalid type argument of unary ‘*’ (have ‘int’) std::cout << "Ptr to " << *value << std::endl;
當
如果僅constexpr在範本函式中運作,因為它允許編譯器避免實例化編譯時未採用的分支。這種優化對於高效能的模板元編程至關重要。 在非模板化函數中,如果 constexpr 仍然評估兩個分支,即使類型是由 decltype 推導的。這意味著上面程式碼中的錯誤是由於嘗試在 if 分支中取消引用 int 值而引起的。
解<code class="cpp">template <typename T> void print(T value) { 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() { auto value = 100; print(value); }</code>要解決此問題,您可以將 if constexpr 語句移至範本函數中。例如:
Ref to 100此修改後的程式碼將編譯並列印預期輸出:
以上是為什麼「if constexpr」會導致 C 17 中的非模板化函數出現錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!