浅析C++11中的右值引用、转移语义和完美转发

2020-01-06 15:44:07丽君

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++教程频道。