首頁  >  文章  >  後端開發  >  為什麼「if constexpr」會導致 C 17 中的非模板化函數出現編譯錯誤?

為什麼「if constexpr」會導致 C 17 中的非模板化函數出現編譯錯誤?

Linda Hamilton
Linda Hamilton原創
2024-11-06 03:20:02847瀏覽

Why Does

在C 17 中的非模板化函數中使用「If constexpr」時出錯

在C 17 中,「if constex」語句允許基於常數表達式有條件地評估和編譯程式碼。但是,此功能在非模板化函數中使用時有限制。

程式碼:

<code class="cpp">#include <iostream>
#include <type_traits>

void print(auto value)
{
  if constexpr (std::is_pointer_v<decltype(value)>)
    std::cout << "Ptr to " << *value << std::endl;
  else
    std::cout << "Ref to " << value << std::endl;
}</code>

問題:

當「if constexpr」在非模板化函數中使用時,如上所示,嘗試取消引用非指標值時會發生編譯錯誤。出現此錯誤的原因是,與模板化函數不同,非模板化函數中的「if constexpr」不會阻止編譯未採用的程式碼路徑。

說明:

在模板化函數中,「if constexpr」允許根據模板參數的值有條件地編譯程式碼。在這種情況下,編譯器可以在編譯時確定模板對於給定的專業化是否有效,並且僅實例化必要的程式碼路徑。

但是,在非模板化函數中,「if constexpr」僅充當運行時的條件語句。編譯器仍然會分析條件語句的兩個分支,如果未採取的分支中有任何程式碼無效,則會發生編譯錯誤。

解決方案:

為了避免此錯誤,請僅在模板化函數或非模板化函數中使用“if constexpr”,其中類型在編譯時已知,並且保證對條件語句的兩個分支都有效。

以上是為什麼「if constexpr」會導致 C 17 中的非模板化函數出現編譯錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn