模板函数,可否以回来值类型作为重载决议的判定规则

模板函数,可否以返回值类型作为重载决议的判定规则?
我记得曾经看到过一个说法是,重载函数的判定是用参数列表的类型,但是模板可以用返回值类型,于是我写了一点很短的代码:

class test
{
    template<class T>
    static int g(T i)
    {
        return i + 1;
    }

    template<class T>
    static double g(T i)
    {
        return i + 100;
    }
};
int main()
{
    double d = test::g(1);
    int i = test::g(1);
    return 0;
}

发现编译不过。VC报错ambiguous call to overloaded function。
这是为什么呢? 网上这个说法不正确么?

------解决思路----------------------
引用:
谢谢你的这个例子,问题是,这两个foo函数参数列表一样,那么重载决议不能区分的时候,用返回值类型推导可以区分。那么这个返回值类型推导属于重载决议的一种吗? 

还是说,你的例子里面,模板的返回值推导是是第一决定因素,还没有到重载决议的那一步就已经区分出来了,所以都不涉及到重载决议?


这根本就不是重载,而是SFINAE。这个机制和重载的区别就在于:没有被选中的函数中,参数中存在至少一个 或 返回值 的类型无效(如果应用模板参数到这个函数的话),而重载中未被选中的函数虽然未被选中但参数和返回值类型都是有效的。比如那个例子里,不管选中的是哪个函数,另一个函数的返回值是无效的(此时它的返回值的enable_if里面没有包含type成员类型)。总之你只需要知道重载决议不会把返回类型当决议判定规则就对了