如果存在可以匹配另一个重载函数的函数模板,那么将调用哪个函数?

时间:2014-11-14 07:23:00

标签: c++

在C ++中,假设您有两个函数定义:

template <typename T>
T square (T num);

double square(double num);

你有一个函数调用,如:

square(1.5);

会调用哪个函数?编译器选择哪个?

3 个答案:

答案 0 :(得分:3)

参数1.5的类型为double,因此它与模板和非模板完全匹配。在这种情况下,根据标准中的[over.best.match],非模板函数将是首选:

  

... F1被定义为更好函数,而不是... F2如果... F1不是函数模板特化, F2是一个功能模板专业化...

如果您使用squareint参数调用float,模板将再次提供完全匹配,但您需要转换或提升非模板。将选择模板,因为它更匹配。

答案 1 :(得分:2)

在这种情况下,C ++总是喜欢非模板版本的函数,因为它可以轻松地将float提升为double。

你使用过这个: -

float p = 2.2;
square(p);

编译器会选择模板版本进行完美匹配。

答案 2 :(得分:1)

由于调用语法与非模板函数匹配,因此它将被称为