彻底弄懂 C++11 右值引用 | 技术总结
移动语义主要解决std::unique_ptr所有权转移的问题,同时可以避免先拷贝再释放资源的问题。
右值引用是用来配合移动语义,实现移动构造函数和移动赋值函数功能。
特别需要注意的是返回右值引用变量时,需要使用std::move()
/std::forward()
显式的移动转发或完美转发(针对不同左右值参数的转发),将变量 “还原” 为右值(右值引用类型)。
std::move()
只转发为右值引用类型,std::forward()
定义两个不涉及左右值类型推导的模板实现完美转发。
术语定义:
左值(lvalue, left value) 是 能被取地址、不能被移动 的值
右值(rvalue, right value) 是 表达式中间结果/函数返回值
左值引用(l-ref, lvalue reference) 用
&
符号引用 左值(但不能引用右值)右值引用(r-ref, rvalue reference) 用
&&
符号引用 右值(也可以指向移动左值)常引用(c-ref, const reference),同时接受左值/右值 进行初始化
由于每个类型可能是左值引用或右值引用,针对所有可能的左右值引用组合,特化所有模板是不现实的。为解决这个问题,有时候符号&&
并不一定代表右值引用,它也可能是左值引用,这叫做通用引用(universal reference),不过这种情况仅发生在模板参数类型 或auto
推导。
版权声明: 本文为 InfoQ 作者【chaozh】的原创文章。
原文链接:【http://xie.infoq.cn/article/968fb02e6480ec3b050caffb7】。文章转载请联系作者。
评论