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

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

Barbara Streisand
發布: 2024-11-06 03:58:02
原創
871 人瀏覽過

Why does

C 17 中非模板化函數中的「If constexpr」錯誤

簡介

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中文網其他相關文章!

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