首頁 > 後端開發 > C++ > 為什麼 C 不能從預設函數參數推導出模板參數?

為什麼 C 不能從預設函數參數推導出模板參數?

DDD
發布: 2024-11-05 09:14:02
原創
998 人瀏覽過

Why Can't C   Deduce Template Arguments from Default Function Arguments?

從預設函數參數推導出範本參數

在C 語言中,程式設計師經常遇到需要從函數呼叫推導模板參數的場景。但是,在某些情況下,這種推導可能會失敗,導致編譯器錯誤。其中一種情況是無法從預設函數參數推導出模板類型參數。

考慮以下程式碼片段:

<code class="cpp">struct foo {
  template <typename T>
  void bar(int a, T b = 0.0f) {
  }
};

int main() {
  foo a;
  a.bar(5);
}</code>
登入後複製

編譯此程式碼時,編譯器可能會產生一個錯誤,指出,「無法推斷T 的模板參數。」為了解決這個問題,需要在函數呼叫中明確指定模板參數,例如a.bar(5)。但為什麼編譯器一開始就無法推導型別呢?

在 C 03 中,語言規範明確禁止使用預設參數來推導模板參數。根據C 03 §14.8.2/17,「模板類型參數不能從函數預設參數的類型推導出來。」

在C 11 中,該語言引入了一項新功能,允許提供預設值函數範本的範本參數:

<code class="cpp">template <typename T = float>
void bar(int a, T b = 0.0f) { }</code>
登入後複製

但是,預設範本參數是強制性的。如果未提供,編譯器仍然禁止使用預設函數參數進行模板參數推導。 C 11 §14.8.2.5/5 指出:

「函數參數的參數類型中使用的範本參數,該函數參數具有預設參數,該預設參數正在執行參數推導的呼叫中使用」是非推導上下文。

總之,雖然為函數參數提供預設參數可以簡化程式碼,但在這種情況下了解模板參數推導的限制至關重要。如果明確提供了預設模板參數,則預設參數只能用於模板參數推導。

以上是為什麼 C 不能從預設函數參數推導出模板參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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