模板引用类型推导

Template references type deducion

本文关键字:引用类型      更新时间:2023-10-16

我有一个模板函数:

template<typename T>
void doSomething(T& value) {
    // doSomething here
}

一切正常,但传递 r 值引用:

doSomething(getTempVal());

产生no matching function for call错误,因为特定的实例化函数模板expects an l-value for 1st argument 。是否有任何解决方法可以允许模板函数在不添加新模板的情况下同时采用左值和右值引用?

是的,只需使用 && 而不是 &

这可能看起来很奇怪,因为您可能认为这将不允许使用左值调用它,但实际上,如果T本身是左值引用类型,那么T &&只是T:它不会成为右值引用类型。

换句话说,

template <typename T>
void f(T &&);
int main() {
  int k = 1;
  f(k); // okay: calls f<int&>
  f(2); // okay: calls f<int>
}

请注意,T可以推导为引用类型,并且需要使函数体来处理它。