重载函数模板

时间:2015-11-22 00:42:15

标签: c++ templates c++11 overloading

#include <iostream>

using namespace std;

template <typename A, typename B> void test(A a, B b) { cout << "first" << endl;}

template <typename A> void test(A a, int b) { cout << "second" << endl;}

template <> void test(int a, int b) { cout << "special" << endl;} //this is a specific instantiation, of which template?

int main(){

    test(2,3); //got: "special"
    test<int>(2,3); //got: "special"
    test<int, int>(2,3); //got: "first". So specialisation is linked to second template, why?
}

选择哪个模板显式特化是实例化的规则是什么?看起来它可能含糊不清。从最后一个函数调用的输出中可以看出,特殊化是针对第二个函数模板定义的(显式模板参数选择第一个模板,但不使用特化 - 所以它必须是第二个模板的特化) ),为什么呢?似乎任何相关信息应该在N3337的[14.7.3]中,但是尽我所能,我找不到我想要的东西。这样做程序可能会出错吗?

当然可能很少有人会担心这一点,但我仍然很好奇它为什么会发生。

0 个答案:

没有答案