【问题标题】:C++ standard, overloaded function resolution/matchingC++ 标准、重载函数解析/匹配
【发布时间】:2010-08-08 04:04:18
【问题描述】:

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

【问题讨论】:

  • 好问题,但问题的主题不多。您是否认为您可以使其更相关,例如“对于 C++ 模板中的数组,参数类型 T (&)[1] 是否比 T* 更匹配”。顺便说一句,我不确定它是否与重载有关。
  • @Mac 我稍微改变了话题,是不是更好?

标签: c++ standards


【解决方案1】:

是的,这是有保证的,但原因与 GMan 所说的不同。将选择“长度为 1 的数组”重载,因为它比模板函数偏序中的第二个更专业。基本上,这意味着T(&amp;)[1] 形式的参数将始终与T* 形式的第二个模板参数匹配,因此当转换序列无法决定时,将始终选择第一个重载。

从 13.3.3 开始:

鉴于这些定义,一个可行的 函数 F1 被定义为更好 功能比另一个可行的功能 F2 如果对于所有参数 i,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*);

否则对于int* 会模棱两可。在 C++0x 中,您甚至可以编写如下声明:

template <class ...Ts>           void f(const Ts&... args);
template <class T, class ... Ts> void f(const T& a, const Ts&... args);

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

【讨论】:

  • 来自@aaa 我删除的答案:@jpa 那么,模板的存在是什么有很大的不同?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
  • 2019-03-24
  • 2018-04-30
  • 2016-12-20
  • 1970-01-01
相关资源
最近更新 更多