在模板参数推导中,sqrt <T>(complex <T>)matche sqrt <T>(<T>)函数调用如何?

saj*_*jas 2 c++ templates arguments template-argument-deduction

template<class T> T sqrt (T);
template<class T> complex<T> sqrt(complex<T>);
double sqrt(double);
void f(complex<double> z)
{
    sqrt(z);
}
Run Code Online (Sandbox Code Playgroud)

在这段代码中,如何sqrt<double>(complex<double>)最终成为模板参数推导的候选者?作者说任何匹配的电话sqrt<T>(complex<T>)也匹配sqrt<T>(<T>).怎么样?

代码来自Bjarne Stroustrup撰写的The C++ Programming Language.第13.3.2节

Die*_*ühl 7

嗯,z是类型complex<double>.随着Tdouble清楚一致

template <typename T> complex<T> sqrt(complex<T>);
Run Code Online (Sandbox Code Playgroud)

此外,与Tcomplex<double>它匹配

template <typename T> T sqrt(T);
Run Code Online (Sandbox Code Playgroud)

这有什么问题?

作为匹配这两个函数的结果,用于决定使用哪个函数的重载集包括两个实例

complex<double> sqrt<double>(complex<double>)
complex<double> sqrt<complex<double>>(complex<double>)
Run Code Online (Sandbox Code Playgroud)

两者都匹配,但第一个更专业,因此,由重载决议选择.