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&.
T& && –>T&.
T&& && –> T&&.
第一列是模板推导的类型,左值T&a

C++11中的std::forward用于实现参数的完美转发,配合模板和右值引用,确保原始参数类型不变。通过引用折叠规则,当模板参数为T&&时,可以实现左值和右值的正确转发。完美转发的关键在于正确地传递参数类型,以调用匹配的DoItActually()函数。
最低0.47元/天 解锁文章

1733

被折叠的 条评论
为什么被折叠?



