彻底弄懂 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
回复
举报
回复
    相关推荐