C++ 类型与非类型模板推导问题

O.T*_*nta 5 c++ templates template-argument-deduction

我有一个关于当有两个匹配时 C++ 模板推导的问题:一个是类型匹配,另一个是非类型匹配。在以下情况下:

// First
template<int>
void g(int a)
{
...
}

// Second
template<class A>
void g(A a)
{
...
}

int a = 1;
g(a);
Run Code Online (Sandbox Code Playgroud)

第二个模板受到青睐,而如果非类型化模板参数被赋予默认值:

// First
template<int m = 1>
void g(int a)
{
...
}

// Second
template<class A>
void g(A a)
{
...
}

int a = 1;
g(a);
Run Code Online (Sandbox Code Playgroud)

第一个模板受到青睐。为什么??这里有哪些规则在起作用?谢谢。

Eri*_*Man 8

在第一种情况下:

// First
template<int>
void g(int a)
{
...
}
Run Code Online (Sandbox Code Playgroud)

只能使用指定的模板参数调用,例如这样g<1>(42);。编译器无法推断出要用于 的值int,因此第一个函数不参与重载决策。

在第二种情况下,有一个默认值,因此现在两个函数都是重载解析的一部分,然后版本int比推导更接近匹配A = int