我有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);
? Isnt 2nd template是第一个特殊版本吗?当我在模板中声明2个参数时,它并不意味着它们必须是不同的类型,它们只是可以。为什么编译器会选择第二个模板呢?
答案 0 :(得分:4)
第二个是“更专业的模板”并且需要更少的“替代”,编译器选择它作为重载决策阶段的最佳选择。
Per§14.5.6.2(功能模板的部分排序):
部分排序选择两个功能模板中的哪一个更多 通过依次转换每个模板来实现专业化(参见 下一段)并使用。执行模板参数推导 功能类型。扣除过程确定是否其中之一 模板比另一个更专业。如果是这样,就越多 专用模板是由部分排序选择的模板 过程