C++11里面有两个函数比较有意思,一个是std::move 另一个就是std::forward.
move函数是用来实现右值引用的。而forward是用来转发参数的。
假设有这样一个模板转发函数:
template<typename T>
void DoSomething(/* */){
DoItActually(/* */);
}
DoItActually(int & a){}//lvalue ver
DoItActually(int&& a){}//rvalue ver
能够自动识别参数,调用合适的DoItActually()函数,那要怎么实现呢?
需要知道,对于模板参数T,如果实参是T类型的左值,则模板参数被推导为T&类型;实参是T类型的右值,则模板参数被推导为T&&类型。
C++11 提出了新的模板匹配规则,即引用折叠规则:
T& & –> T&.
T&& & –> T&.