C标准是否保证以下内容?:
template<typename T> void function(T (&)[1]); template<typename T> void function(T*); int a[1]; function(a); // first function gets called,not second version
解决方法
是的,这是有保证的,但原因与GMan所说的不同.将选择“长度为1的数组”重载,因为它比模板函数偏序中的第二个更专业.基本上,它意味着T(&)[1]形式的参数将始终匹配T *形式的第二个模板参数,因此当转换序列未决定时,将始终选择第一个重载.
从13.3.3开始:
Given these definitions,a viable
function F1 is defined to be a better
function than another viable function
F2 if for all arguments i,ICSi(F1) is
not a worse conversion sequence than
ICSi(F2),and then
for some argument j,ICSj(F1) is a better conversion sequence than
ICSj(F2),or,if not that,F1 is a non-template function and F2 is a template function specialization,
or,F1 and F2 are template functions,and the function template for F1 is
more specialized than the tem- plate
for F2 according to the partial
ordering rules described in 14.5.5.2,…
正常功能仅受第一项影响;当任何模板函数在候选函数集中时,第二或第三项可以决定.我们想要它的原因是我们希望能够编写看似模糊的模板化重载.例如.
template <class T> void f(T); template <class T> void f(T*);
否则对于int *会有歧义.在C 0x中,您甚至可以编写如下声明:
template <class ...Ts> void f(const Ts&... args); template <class T,class ... Ts> void f(const T& a,const Ts&... args);
只要至少有一个参数,就会选择第二个.