如果存在可以匹配另一个重载函数的函数模板,将调用哪个函数
Which function would be called if a function template exists that could match another overloaded function?
在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
是函数模板专用化...
如果您使用 int
或 float
参数调用square
,模板将再次提供完全匹配,但您需要对非模板进行转化或推广。将选择模板,因为它是更好的匹配。
在这种情况下,
C++总是更喜欢函数的非模板版本,因为它可以很容易地将浮点数提升为双倍。
你有没有用过这个:-
float p = 2.2;
square(p);
编译器会在其冒险中选择模板版本以实现完美匹配。
由于调用语法与非模板函数匹配,因此将调用
相关文章:
- 函数作为模板参数,是否对返回类型强制约束
- 将函数作为模板参数传递给类
- 模板化类构造函数的模板实例化
- 使用可变参数函数作为模板参数
- 没有默认构造函数作为模板参数的自定义比较器
- 保留函数指针模板参数
- 模板推导:为什么函数指针模板定义在常量和/或引用时不匹配?
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- 指向成员函数的模板指针 - getter
- 如何通过构造函数传递模板参数?
- 在运行时使用枚举器值作为模板函数的模板参数的元程序
- 无法在C++中创建类似函数的模板
- 通过类型别名从构造函数转发模板推导
- "typename"不应该只在模板函数或模板类中使用吗?
- C++常规指针函数或模板
- C2783: 无法推断帮助程序函数的模板参数
- 我可以在类中存储构造函数的模板参数吗?
- 为什么C++不允许两个同名的函数/类模板,区别仅在于非类型模板参数(整型)的类型?
- 将参数从一个函数传递到另一个函数(没有模板) - C++
- 将类成员函数的模板定义放在 CPP 文件中C++隐式实例化而不是 .H 允许吗?