C++法则2:对于一个调用,如果一个非函数模板与一个函数模板提供同样好的匹配,则选择非模板版本。
当存在一个非模板函数和一个函数模板都能提供同样好的匹配时,编译器会优先选择非模板版本。这个规则体现了C++对确定性和明确性的偏好。
-
"同样好的匹配":指参数类型匹配程度相同(如完全匹配或需要相同的隐式转换)
-
优先顺序:非模板函数 > 模板特化 > 模板生成的函数
-
设计意图:避免模板意外覆盖已有的精确匹配函数
#include <iostream>// 非模板函数
void foo(int x) {std::cout << "Non-template function: " << x << std::endl;
}// 函数模板
template <typename T>
void foo(T x) {std::cout << "Function template: " << x << std::endl;
}int main() {foo(42); // 调用非模板版本foo(3.14); // 调用模板生成的foo<double>foo('a'); // 调用模板生成的foo<char>
}