【问题标题】:Non-const pointer prefers const T& overload to const T*非 const 指针更喜欢 const T& 重载而不是 const T*
【发布时间】:2017-02-16 01:07:01
【问题描述】:

假设我有两个函数的重载

template <typename T>
void f(const T&) {
    cout << "f(T&)" << endl;
}

template <typename T>
void f(const T*) {
    cout << "f(T*)" << endl;
}

为什么f(new int) 解析为f(const T&amp;) 而不是f(const T*)?标准中的任何地方都谈到了这种违反直觉的行为?

http://ideone.com/kl8NxL

【问题讨论】:

  • f(new int) 解析为f(const T&amp;)T 设置为int*,而不是T 设置为int。就好像您正在调用带有签名的函数。 f(int* const&amp;);
  • 我知道这部分。我的问题是,为什么 f(int* const&amp;)f(const int*) 更匹配?

标签: c++ c++11 overloading


【解决方案1】:

对于带有模板推导的重载解析,第一步是解析模板。然后将非模板排序应用于结果。在您的代码中,模板分辨率为:

void f(int * const &)   // 1

void f(int const *)     // 2

根据 C++14 [over.ics.ref],在 (1) 中直接绑定到参数的引用是身份转换(即使添加了 cv 限定符) . TT const &amp; 的绑定是直接绑定,即不会创建和绑定临时对象。

但是,(2) 涉及资格转换。参数类型int *必须先转换为const int *才能匹配函数参数。

身份转换被认为是任何非身份转换序列的子序列,因此(1)根据子序列规则[over.ics.rank]/3.1.1获胜

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-24
    • 2013-10-20
    • 2012-08-02
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    相关资源
    最近更新 更多