彻底弄懂 C++11 右值引用 | 技术总结

用户头像
chaozh
关注
发布于: 2020 年 07 月 22 日

移动语义主要解决std::unique_ptr所有权转移的问题,同时可以避免先拷贝再释放资源的问题。



右值引用是用来配合移动语义,实现移动构造函数和移动赋值函数功能。



Data data;

Data&& data2 = Data{}; // OK
Data&& data2 = std::move(data); // OK




特别需要注意的是返回右值引用变量时,需要使用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推导。



发布于: 2020 年 07 月 22 日 阅读数: 5
用户头像

chaozh

关注

还未添加个人签名 2017.10.19 加入

还未添加个人简介

评论

发布
暂无评论
彻底弄懂C++11右值引用 | 技术总结