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

Which function would be called if a function template exists that could match another overloaded function?

本文关键字:函数 函数模板 调用 重载 存在 另一个 如果      更新时间:2023-10-16

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

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

double square(double num);

并且您有一个函数调用,例如:

square(1.5);

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

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

F1定义为比... F2如果... F1不是函数模板专用化,F2是函数模板专用化...

如果您使用 intfloat 参数调用square,模板将再次提供完全匹配,但您需要对非模板进行转化或推广。将选择模板,因为它是更好的匹配。

在这种情况下,

C++总是更喜欢函数的非模板版本,因为它可以很容易地将浮点数提升为双倍。

你有没有用过这个:-

float p = 2.2;
square(p);

编译器会在其冒险中选择模板版本以实现完美匹配。

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