1. 非模板函数优先
如果有非模版函数,优先调用非模版函数。
1 2 3 4
| void foo(int x) {} template <typename T> void foo(T x) {}
foo(5);
|
2. 更特化的模板优先
如果多个模板可行,编译器选择更特化(更具体)的模板版本。
1 2 3 4 5
| template <typename T> void foo(T x) {} template <typename T> void foo(T* x) {}
int x = 0; foo(&x);
|
3. 精确匹配优于类型转换
若参数匹配需要隐式类型转换,模板生成的精确匹配版本优先于需要转换的非模板函数。
1 2 3 4
| void foo(double x) {} template <typename T> void foo(T x) {}
foo(5);
|
4. 引用和值类型的优先级
引用类型(尤其是 T&& 万能引用)可能影响匹配:
1 2 3 4 5
| template <typename T> void foo(T&& x) {} void foo(int x) {}
foo(5); foo(x);
|
5. 若存在多个同样好的匹配,编译器报错:
1 2 3 4 5
| template <typename T> void f(T x) {} template <typename T> void f(T* x) {}
int x = 0; f(&x);
|
6. 可变参数模板优先级最低
1 2 3 4
| template <typename... Args> void f(Args... args) {} template <typename T> void f(T x) {}
f(5);
|