1

我有 2 个重载函数模板:

template <class typ1, class typ2>
void szab(typ1, typ2) {cout << "2 typy" << endl;}

template <class typ1>
void szab(typ1, typ1) {cout << "1 typ" << endl;}

为什么当我调用这样的函数时没有歧义:szab(1, 1);?第二个模板不是第一个模板的特殊版本吗?当我在模板中声明 2 个参数时,这并不意味着它们必须是不同的类型,它们只是可以。那么为什么编译器会选择第二个模板呢?

4

1 回答 1

4

第二个是“更专业的模板”,需要更少的“替换”,编译器选择它作为重载解决阶段的最佳选择。

根据 §14.5.6.2(功能模板的部分排序):

部分排序通过依次转换每个模板(参见下一段)并使用函数类型执行模板参数推导来选择两个函数模板中的哪一个比另一个更专业。推演过程确定模板中的一个是否比另一个更专业。如果是这样,更专业的模板是部分排序过程选择的模板。

于 2013-10-21T20:20:31.960 回答