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

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

Barbara Streisand
Barbara Streisand原創
2024-11-06 03:58:02866瀏覽

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

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