2017-04-02 109 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也是一样的。这是编译时发生的,所以数据类型必须向函数声明,因为编译器不知道你需要什么。