回复
彻底弄懂 C++11 右值引用 | 技术总结
蓝月亮
发布于 2020-9-2 19:13
浏览
1收藏
移动语义主要解决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推导。
分类
标签
赞
1
收藏 1
回复
相关推荐