我有一个模板功能:
template<typename T>
void doSomething(T& value) {
// doSomething here
}
一切正常,但传递r值参考:
doSomething(getTempVal());
产生no matching function for call
错误,因为特定的实例化函数模板expects an l-value for 1st argument
。是否有任何变通方法允许模板函数同时使用左值和右值引用而不添加新模板?
答案 0 :(得分:4)
是的,只需使用&&
代替&
。
这可能看起来很奇怪,因为你可能认为这会禁止用左值调用它,但实际上,如果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
可以推断为引用类型,并且需要使用函数体来处理它。