C++模板函数选择

tim*_*014 5 c++ templates

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.为什么?

R S*_*ahu 1

如果您要明确模板参数,您将使用:

foo<int, int>(a, b);
Run Code Online (Sandbox Code Playgroud)

调用第一个函数。

你会使用:

foo<int>(a, b);
Run Code Online (Sandbox Code Playgroud)

调用第二个函数。

由于您让编译器选择函数,因此它选择了限制性更强的函数,即第二个函数。

为什么第二个限制更严格?编译器必须推断出一种类型才能使用第二个函数。它必须推断出两种类型才能使用第一种类型。

  • 我认为 foo&lt;int&gt;(a, b) 仍然执行重载解析,并且只使用第二个函数,因为该函数更专业。 (2认同)