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

Any*_*orn 7 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
Run Code Online (Sandbox Code Playgroud)

jpa*_*cek 6

是的,这是有保证的,但原因与GMan所说的不同.将选择"长度为1的数组"重载,因为它比模板函数部分顺序中的第二个更专业.基本上,这意味着表单中的参数T(&)[1]将始终与表单中的第二个模板参数匹配T*,因此当转换序列未决定时,将始终选择第一个重载.

从13.3.3开始:

给定这些定义,可行函数F1被定义为比另一个可行函数F2更好的函数,如果对于所有自变量i,ICSi(F1)不是比ICSi(F2)更差的转换序列,然后

  • 对于某些参数j,ICSj(F1)是比ICSj(F2)更好的转换序列,或者,如果不是,

  • F1是非模板函数,F2是模板函数特化,或者,如果不是,

  • F1和F2是模板函数,根据14.5.5.2中描述的偏序规则,F1的函数模板比​​F2的模板更专业,或者,如果不是,

...

正常功能仅受第一项影响; 当任何模板函数在候选函数集中时,第二或第三项可以决定.我们想要它的原因是我们希望能够编写看似模糊的模板化重载.例如.

template <class T> void f(T);
template <class T> void f(T*);
Run Code Online (Sandbox Code Playgroud)

否则将是模棱两可的int*.在C++ 0x中,您甚至可以编写如下声明:

template <class ...Ts>           void f(const Ts&... args);
template <class T, class ... Ts> void f(const T& a, const Ts&... args);
Run Code Online (Sandbox Code Playgroud)

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