有关函数模板与重载函数的调用优先级有关问题

有关函数模板与重载函数的调用优先级问题
在C++Primer上看模板特化时遇到的一个问题
#include <iostream>
using namespace std;

template<class T>
void func(T &s)
{
cout << "template version!" << endl;
cout << sizeof(s) << ":\t" << s << endl;
}

void func(const char *s)
{
cout << "special version!" << endl;
cout << sizeof(s) << ":\t" << s << endl; 
}

int main()
{
char s[] = "asdasdasd";
func(s);
return 0;
}


输出:
special version!
4:      asdasdasd
Press any key to continue

如上代码,为什么在调用func()函数时调用的是重载版本而不是去实例化一个模板函数?
我的想法是:对模板函数,只要把T实例化为char[10]就可以了,但对普通重载函数则需要将数组转换为指针。所以优先级应该是函数模板比普通重载函数更大啊,为什么实际上的输出是"special version"?
C++ 模板 重载 优先级

------解决方案--------------------
楼上回帖前有没有试一下程序呢?
主楼的程序应该调用函数模板,我这里测试(g++-4.8.0)也确实调用的函数模板。
如果调用普通函数,那是编译器自己的问题。
------解决方案--------------------
有关函数模板与重载函数的调用优先级有关问题

为什么 我在codeblocks上运行是你想要的结果?
------解决方案--------------------
vs2012的结果和LZ的一样。

仔细看了一下,感觉绑定到模板的要符合标准些,因为两者的conversion sequence都是
Standard conversion sequences。

这里的引用绑定属于identity conversion,其rank是Exact Match。
而调用普通函数时实参是数组类型,形参是指针类型,所以这里有array-to-pointer conversion和qualification conversions,两者的rank一样,最后的转换rank是Exact Match。

然而,仅比较rank,都是一样,无区别。但是在相同情况下,identity conversion优于非
indentity conversion,所以引用绑定的要优于后者。

还可以加个void func(char (&s)[10])玩一把。

------解决方案--------------------
按这样分析的话,函数版本去掉const后,
the identity conversion sequence is considered to be a subsequence of any non-identity
conversion sequence