为什么不自动推断参考模板参数?

时间:2017-09-21 12:11:01

标签: c++ reference

在以下示例中,我直截了当地期望拨打inc(iref)来调用T=int&的inc-function,因为这是iref的类型。但是,似乎在将变量传递给函数时会删除&,因此在T=intinc(i)的情况下都会导致inc(iref)。只有在明确指定模板参数作为参考时,我才会发生这种行为。

template<typename T> 
void inc(T t) {
    t++;
}

int main() {
    int i = 41;
    int& iref = i;

    iref++;
    std::cout << i << " " << iref << std::endl; // prints 42 42, as expected

    inc(i);
    std::cout << i << " " << iref << std::endl; // still prints 42 42, as expected

    inc(iref);
    std::cout << i << " " << iref << std::endl; // prints 42 42, instead of 43 43

    inc<int&>(iref);
    std::cout << i << " " << iref << std::endl; // now finally prints 43 43
}

所以,我的问题是:

  • 为什么这个参考似乎变成了一个“裸露的”。通过inc(iref)传递时的价值?背后的过程是什么?
  • 为什么这样做/设计决策背后的理由是什么?如果它按照我直观的预期方式运作会有任何问题或负面后果吗?

1 个答案:

答案 0 :(得分:-1)

引用被剥去了它的参考值,因为如果它不是iref,否则是不明确的(int&amp;或int)。它是这样设计的,所以你可以像下面一样重载:

#include <iostream>

template<typename T> 
void inc(T& t) {
    t++;
}

int main() {
    int i = 41;
    int& iref = i;

    inc(iref);
    std::cout << iref << std::endl;
}