在下面的例子:模板返回類型函數在C++中如何工作?
template<typename T>
T Get()
{
T t = 10;
return t;
}
int main()
{
int i = Get<int>(); // will work
float f = Get<float>(); // will work
}
函數重載不只是不同的返回類型的工作。 那麼,在這種情況下,編譯器最終會產生什麼?
在下面的例子:模板返回類型函數在C++中如何工作?
template<typename T>
T Get()
{
T t = 10;
return t;
}
int main()
{
int i = Get<int>(); // will work
float f = Get<float>(); // will work
}
函數重載不只是不同的返回類型的工作。 那麼,在這種情況下,編譯器最終會產生什麼?
當您通過Get<int>
或Get<double>
調用函數時,編譯器不需要推導返回類型。代碼T t = 10
將執行鑄造操作以鍵入T
。
template<typename T>
T Get()
{
T t = 1.5;
return t;
}
main()
{
int i = Get<int>(); // returns 1
double f = Get<double>(); // returns 1.5
}
然而,在某些編譯該代碼並生成警告
warning: implicit conversion from 'double' to 'int' changes value from 1.5 to 1 [-Wliteral-conversion]
在這種情況下T t = static_cast<T>(1.5);
可能是一個更好的選擇:如果10
與非整數樣1.5
更換這是更清晰。
@ user4815162342謝謝! – jwimberley
編譯器爲每種不同的數據類型複製de代碼。在你的例子中,用int代替T的代碼將被生成,並且對於float也是一樣的。這是編譯時發生的,所以數據類型必須向函數聲明,因爲編譯器不知道你需要什麼。
由於代碼中存在大量錯誤,因此編譯器不會生成任何內容。 –
@NeilButterworth在代碼中只有一行會產生錯誤(重複使用'i'並在沒有類型指定的情況下調用'Get'),並且問題清楚地注意到這行不能編譯。人們通常會寫出幾條平行線,這些線並不意味着全部同時使用,而是代之以證明有效和無效的情況,而且這個問題在這個問題上已經清楚地註明了。所以,我不認爲這是一個公平的批評。 – jwimberley