c++ - 模板函数不使用右值引用实例化/接收调用
问题描述
如标题中所述,当我显式实例化一个函数的左值和右值版本时,它可以工作,如果我尝试使用模板这样做,它就不会。海合会 7.4。我错过了什么?
class Test {};
class Explicit {
public:
void func (const Test &t) {
cout << std::is_rvalue_reference<const Test&>::value << endl;
}
void func (Test &&t) {
cout << std::is_rvalue_reference<Test&&>::value << endl;
}
};
class Implicit {
public:
template<class T>
void func (T t) {
cout << std::is_rvalue_reference<T>::value << endl;
}
};
// explicitly instantiate two versions of the function
template void Implicit::func<const Test &> (const Test &);
template void Implicit::func<Test &&> (Test &&);
int main () {
Explicit e = Explicit ();
Implicit i = Implicit ();
Test t;
e.func (t); // goes to func (const Test&), as expected
e.func (Test ()); // goes to func (Test&&), as expected
e.func ((Test &&) Test ()); // goes to func (Test&&), as expected
i.func (t); // goes to func (const Test&), as expected
i.func (Test ()); // goes to func (const Test&), not as expected!
i.func ((Test &&) Test ()); // goes to func (const Test&), not as expected!
}
解决方案
您的显式实例化是无用的(在拆分标头和 cpp 时可能很有用):
// explicitly instantiate two versions of the functions
template void Implicit::func<const Test &> (const Test &);
template void Implicit::func<Test &&> (Test &&);
对于您的“隐式”,您实际上得到了:
i.func (t); // goes to func(Test)
i.func (Test ()); // goes to func(Test)
i.func ((Test &&) Test ()); // goes to func(Test)
作为
template<class T> void func (T t)
不推断参考。
然后你打电话void Implicit::func<Test>
。