C ++标准,重载函数解析/匹配

时间:2010-08-07 19:17:13

标签: c++ standards

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

1 个答案:

答案 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);

,只要有至少一个参数,就会选择第二个。