為什麼不能從預設函數參數推導出模板類型參數
在C 中,一個常見的誤解是編譯器可以推導出模板類型參數來自預設函數參數。然而事實並非如此。
當遇到以下程式碼時:
<code class="cpp">struct foo { template <typename T> void bar(int a, T b = 0.0f) { } }; int main() { foo a; a.bar(5); // Error: could not deduce template argument for T }</code>
編譯器無法從預設參數 0.0f 推導出類型 T。相反,它需要明確的規範,如a.bar
C 03 禁止
在C 03 中,語言規範明確禁止使用模板參數推導的預設函數參數(C 03 §14.8.2/17):
A template type-parameter cannot be deduced from the type of a function default argument.
C 11 預設範本參數
在 C 11 中,一種解決方法出現:引入預設範本參數。透過修改程式碼如下:
<code class="cpp">template <typename T = float> void bar(int a, T b = 0.0f) { }</code>
提供了預設的模板參數T。但是,應該注意的是,擁有預設模板參數並不能減輕對預設函數參數的限制。
根據 C 11 14.8.2.5/5,預設函數參數被視為「非推導上下文」範本參數推導過程。這意味著編譯器無法使用函數參數的預設值來推斷模板類型參數。
結論
雖然預設函數參數提供了便利,但模板類型參數不應該從他們身上推斷出。對於需要預設值的情況,預設範本參數提供了更便攜、更靈活的解決方案。
以上是為什麼不能從 C 中的預設函數參數推導出模板類型參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!