從預設函數參數推導出範本參數
在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
在 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中文網其他相關文章!