C++ 类型与非类型模板演绎问题

C++ Type vs. Non-Type Template Deduction Question

提问人:O.T.Vinta 提问时间:8/9/2023 更新时间:8/9/2023 访问量:62

问:

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

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

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

int a = 1;
g(a);

第二个模板是首选,而如果非类型化模板参数被赋予默认值:

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

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

int a = 1;
g(a);

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

C++ 模板 template-argument-deduction

评论

0赞 StoryTeller - Unslander Monica 8/9/2023
在第一种情况下,非类型模板参数应具有什么值?您似乎将其与函数参数混为一谈。它不会从 .a
0赞 O.T.Vinta 8/9/2023
这实际上是 C++ 认证测试中的一个问题。我想这就是答案——如果无法确定参数值,则根本不使用模板。

答:

8赞 Erik Man 8/9/2023 #1

在第一种情况下:

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

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

在第二种情况下,有一个默认值,所以现在这两个函数都是重载解决的一部分,然后版本比推断更接近。intA = int