if constexpr 在C 17 中的非模板化函數中的行為與預期不同
在C 17 中,if constexpr 語句允許條件基於編譯時常數表達式的編譯。但是,當嘗試在非模板化函數中使用此功能時,可能會出現意外的編譯錯誤。
考慮以下程式碼片段:
編譯此程式碼時,會出現錯誤發生在嘗試在 if constexpr 語句中取消引用「value」的行上。這是因為非模板化函數不支援 if constexpr。
為什麼只有模板?
此行為是設計使然。 if constexpr 旨在防止基於特定專業化的無效模板程式碼的實例化。在提供的範例中,非模板化函數使用 std::is_pointer_v
解決方案
在非中使用 if constexpr模板化上下文,請考慮將程式碼包裝在模板函數中或使用在編譯時表現不同的宏。例如:
在這種情況下,列印函數是模板化的,因此如果基於模板參數正確應用 constexpr 行為。
以上是為什麼 `if constexpr` 在 C 17 中的非模板化函數中不起作用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!