首頁 > 後端開發 > C++ > 為什麼 `if constexpr` 在 C 17 中的非模板化函數中不起作用?

為什麼 `if constexpr` 在 C 17 中的非模板化函數中不起作用?

Barbara Streisand
發布: 2024-11-06 19:01:03
原創
577 人瀏覽過

Why Doesn't `if constexpr` Work in Non-Templated Functions in C  17?

if constexpr 在C 17 中的非模板化函數中的行為與預期不同

在C 17 中,if constexpr 語句允許條件基於編譯時常數表達式的編譯。但是,當嘗試在非模板化函數中使用此功能時,可能會出現意外的編譯錯誤。

考慮以下程式碼片段:

編譯此程式碼時,會出現錯誤發生在嘗試在 if constexpr 語句中取消引用「value」的行上。這是因為非模板化函數不支援 if constexpr。

為什麼只有模板?

此行為是設計使然。 if constexpr 旨在防止基於特定專業化的無效模板程式碼的實例化。在提供的範例中,非模板化函數使用 std::is_pointer_v 檢查「value」是否是指標。但是,如果條件為 false,編譯器仍會嘗試取消引用整數“value”,這是無效的。

解決方案

在非中使用 if constexpr模板化上下文,請考慮將程式碼包裝在模板函數中或使用在編譯時表現不同的宏。例如:

在這種情況下,列印函數是模板化的,因此如果基於模板參數正確應用 constexpr 行為。

以上是為什麼 `if constexpr` 在 C 17 中的非模板化函數中不起作用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板