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
答案 0 :(得分:6)
是的,这是有保证的,但原因与GMan所说的不同。将选择“长度为1的数组”重载,因为它比模板函数部分顺序中的第二个更专业。基本上,这意味着T(&)[1]
形式的参数将始终与T*
形式的第二个模板参数匹配,因此当转换序列未决定时,将始终选择第一个重载。
从13.3.3开始:
鉴于这些定义,一个可行的 函数F1被定义为更好 功能比另一个可行的功能 如果对于所有参数i,则为F2,ICSi(F1)为 转换顺序并不比 ICSi(F2),然后
对于某些参数j,
,ICSj(F1)是比转换序列更好的转换序列 ICSj(F2),或者,如果不是,
F1是非模板函数,F2是模板函数专用, 或者,如果不是那样,
F1和F2是模板功能,F1的功能模板是 比模板更专业 对于F2,根据部分 订购规则在14.5.5.2中描述, 或者,如果不是那样,
...
正常功能仅受第一项影响;当任何模板函数在候选函数集中时,第二或第三项可以决定。我们想要它的原因是我们希望能够编写看似模糊的模板化重载。例如
template <class T> void f(T);
template <class T> void f(T*);
否则{p}对于int*
会有歧义。在C ++ 0x中,您甚至可以编写如下声明:
template <class ...Ts> void f(const Ts&... args);
template <class T, class ... Ts> void f(const T& a, const Ts&... args);
,只要有至少一个参数,就会选择第二个。