2017-04-02 50 views
0

在下面的例子:模板返回類型函數在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 
} 

函數重載不只是不同的返回類型的工作。 那麼,在這種情況下,編譯器最終會產生什麼?

+1

由於代碼中存在大量錯誤,因此編譯器不會生成任何內容。 –

+2

@NeilButterworth在代碼中只有一行會產生錯誤(重複使用'i'並在沒有類型指定的情況下調用'Get'),並且問題清楚地注意到這行不能編譯。人們通常會寫出幾條平行線,這些線並不意味着全部同時使用,而是代之以證明有效和無效的情況,而且這個問題在這個問題上已經清楚地註明了。所以,我不認爲這是一個公平的批評。 – jwimberley

回答

0

當您通過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更換這是更清晰。

+0

@ user4815162342謝謝! – jwimberley

0

編譯器爲每種不同的數據類型複製de代碼。在你的例子中,用int代替T的代碼將被生成,並且對於float也是一樣的。這是編譯時發生的,所以數據類型必須向函數聲明,因爲編譯器不知道你需要什麼。