C标准,重载功能解析/匹配

前端之家收集整理的这篇文章主要介绍了C标准,重载功能解析/匹配前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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);

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

猜你在找的C&C++相关文章