template<typename TA, typename TB>
void foo (TA a, TB b); // #1
template<typename T>
void foo (T a, T b); // #2
int a, b;
foo(a, b);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,调用foo#2.为什么?
如果您要明确模板参数,您将使用:
foo<int, int>(a, b);
Run Code Online (Sandbox Code Playgroud)
调用第一个函数。
你会使用:
foo<int>(a, b);
Run Code Online (Sandbox Code Playgroud)
调用第二个函数。
由于您让编译器选择函数,因此它选择了限制性更强的函数,即第二个函数。
为什么第二个限制更严格?编译器必须推断出一种类型才能使用第二个函数。它必须推断出两种类型才能使用第一种类型。