函數模版和同名普通函數在同一個作用域中,會優先調用那個函數?
函數模型在進行調用的時候會進行嚴格的類型匹配,而普通函數在調用的時候,會進行函數參數類型轉換(前提是自動類型轉換)。
調用函數模版,本質是類型參數化,將要嚴格的按照類型進行匹配,不會進行自動類型轉換
調用普通函數,可以進行隱式的數據類型轉換(前提是可以進行自動類型轉換),這是普通函數和模版函數的本質區別。
函數模版可以像普通函數被重載
C++編譯器優先考慮普通函數:這是因為普通函數已經存在了,而模版函數還需要進一步的判斷
如果函數模版產生一個更好的匹配,那么優先選擇函數模版
可以通過空模版實參列表的語法限制編譯器只調用模版函數(也就是在參數名之后加上<>,隱含了自動類型推斷!)
C++編譯器是如何支持模版機制的。
編譯器相關知識:
編譯C語言用GCC,編譯C++用的是G++
對於源程序的預處理,宏定義進行宏展開
編譯器
匯編器
連接器
C++編譯器提供的模版機制,就是通過二次編譯,生成對應具體的函數,函數模版最終最終根據函數調用變成一個個函數,也就是和普通函數沒有差別,也可以和普通函數發生函數重載。
編譯器並不是把函數模板處理成能夠處理任意類的函數
編譯器從函數模板通過具體類型產生不同的函數
編譯器會對函數模板進行兩次編譯
第一次編譯在聲明的地方對模板代碼本身進行編譯;第二次編譯在調用的地方對參數替換后的代碼進行編譯。
模板類派生的時候要指定父類的類型,用於內存空間大小的分配。