博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
右值引用
阅读量:6222 次
发布时间:2019-06-21

本文共 1278 字,大约阅读时间需要 4 分钟。

右值引用


1. 什么是左值和右值

有几种区分方法:

  • 左值就是即能出现在等号左边也能出现在等号右变的变量(表达式), 右值就只能出现在等号的右边
  • 能取地址的就是左值,不能取地址的就是右值
int i, j, k;i = 1; // i是左值, 1是右值i = j; // i, j 都是左值 1 = i; // 错误, 1是右值

2. 什么是左值引用和右值引用

如果左值同时又有&标识符,就被称为左值引用

int i = 0;int& j = i; // j为左值引用int& k = 1; // 错误,右值是不可修改的,所以k被绑定到1是语法错误const int& k2 = 1 // 正确,const 左值引用不能被修改

右值通过&&符号表明它是一个右值引用,只能绑定到右值上

int i = 0;int&& j = i; // 错误,右值引用不能绑定到左值上int&& k = 1; // 正确int&& k2 = i + 42; // 正确, i + 42是右值int& k3 = i + 42; // 错误

3.右值引用它要解决什么问题,怎么使用

c++11引入右值引用主要解决两个问题:

1.对需要拷贝的临时对象(右值)进行移动操作,提升效率

在c++11以前,因为想避免深拷贝的性能损失,我们把本应该写成

vector
GetResource(int args); // (1)

写成了

void GetResouce(int args, vector
* output); // (2)

在c++中,我们可以大胆的写成(1)这种形式,如果返回的是栈对象,就会优先调用移动构造函数,而不是拷贝构造函数

在我们写函数声明的时候,只有当:

  1. 函数内需要copy参数时
  2. 需要将参数保存到栈外内存时

我们可以把参数声明为右值引用,比如标准库里的vertorpush_back

void push_back(const T& v);void push_back(T&& v);

如果只满足第一个条件,我们可以使用

void Func(const T& v){    // 这里直接调用一次copy构造函数    local l = v;}

2.在模板函数中按参数的实际类型进行转发

void Fun(const int&){    std::cout << "lvalue" << std::endl;}void Fun(int&& i){    std::cout << "rvalue" << std::endl;}template 
void ForwardValue(T&& v){ // 使用forward把值的类型原样转发给Fun Fun(std::forward
(v));}int main(){ ForwardValue(1); int a = 1; ForwardValue(a); return 0;}

转载地址:http://bwgja.baihongyu.com/

你可能感兴趣的文章
transform函数
查看>>
MySQL服务器安装配置-非安装版、windows版
查看>>
批量往数据库导入数据遇到的问题总结
查看>>
一个小公司的前端笔试HTML CSS JS
查看>>
noip普及组2018T1 标题统计
查看>>
vim配置@year12
查看>>
排序——数据结构课程作业
查看>>
Grunt Gulp Browserify Webpack
查看>>
Shortest Distance from All Buildings
查看>>
rdm代码网址
查看>>
乘方取模计算(模幂计算)
查看>>
Ubuntu安装PyCharm
查看>>
如何将CTB词性标签映射为universalPOs标签
查看>>
BZOJ5299:[CQOI2018]解锁屏幕(状压DP)
查看>>
Mac OSX 快捷键&命令行总览
查看>>
c++面试题之内存分配
查看>>
水果忍者(切西瓜)
查看>>
集合问题
查看>>
HTML
查看>>
渗透测试辅助工具--在线版
查看>>