隐式使用C++模板

Sec*_*ret 2 c++ templates arguments explicit function

我已经定义了这样的功能:

template<typename T>
void SwapMe(T *first, T *second)
{
    T tmp = *first;
    *first = *second;
    *second = tmp;
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

SwapMe(&data[i], &data[j]);
Run Code Online (Sandbox Code Playgroud)

如你所见,我没有明确使用,SwapMe<T>(...);但确实有效!
为什么C++标准允许避免显式指定参数的类型?

Aru*_*run 5

必要的T可以从类型中推断出来*first.

只有在编译器无法自动进行推导时,才需要由程序员明确指定.

这个(看似简单但实际上非常复杂)的现象被称为Argument Dependent Name Lookup或Koenig lookup,以其发明者Andrew Koenig的名字命名.