T&& A& A&
T&& A&& A&&
因此,对于前例的函数包装要求,采用以下模板就可以解决:
template<typename T>
void cover(T&& para){
...
func(static_cast<T &&>(para));
...
}
如果传入的是左值引用,转发函数将被实例化为:
void func(T& && para){
func(static_cast<T& &&>(para));
}
应用引用折叠,就为:
void func(T& para){
func(static_cast<T&>(para));
}
如果传入的是右值引用,转发函数将被实例化为:
void func(T&& &¶){
func(static_cast<T&& &&>(para));
}
应用引用折叠,就是:
void func(T&& para){
func(static_cast<T&&>(para));
}
对于以上的static_cast<T&&> ,实际上只在para被推导为右值引用的时候才发挥作用,由于para是左值(右值引用是左值),因此需要将它转为右值后再传入func内,C++ 11在<untility>定义了一个std::forward<T>函数来实现以上行为,
所以最终版本为
template<typename T>
void cover(T&& para){
func(forward(forward<T>(para)));
}
std::forward的实现与static_cast<T&&>(para)稍有不同
std::forward函数的用法为forward<T>(para) , 若T为左值引用,para将被转换为T类型的左值,否则para将被转换为T类型右值
总结
以上就是关于C++11中右值引用、转移语义和完美转发的全部内容,这篇文章介绍的很详细,希望对大家的学习工作能有所帮助。
注:相关教程知识阅读请移步到C++教程频道。










