首頁  >  文章  >  後端開發  >  為什麼 `if constexpr` 在非模板化 C 函數中不能如預期般運作?

為什麼 `if constexpr` 在非模板化 C 函數中不能如預期般運作?

Susan Sarandon
Susan Sarandon原創
2024-11-06 10:54:02496瀏覽

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

如果C 17 中的constexpr 不適用於非模板化函數

簡介

C 17 標準引入了if constexpr 構造,它允許基於常數表達式的條件執行。但是,據觀察,如果 constexpr 在模板化函數和非模板化函數中使用時行為不同。

問題

考慮以下非模板化函數:

<code class="cpp">void print()
{
  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;
  }
}</code>

此程式碼會導致編譯錯誤,因為*value 對於推導的類型int無效。

答案

此行為是設計使然。在模板化函數中, if constexpr 可以避免實例化對於特定模板特化無效的分支。但是,在非模板化函數中,if constexpr 不會抑制未採用分支的編譯。

if constexpr 語句的兩個分支都會被解析和分析,即使未採用的分支無效。因此,在上面的程式碼中,編譯器將嘗試計算 int 類型的 *value,從而導致錯誤。

結論

理解這種區別很重要當使用 if constexpr 時。在非模板化函數中,它只能用於檢查保證對輸入參數的所有可能值都有效的常數表達式。

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

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