当前位置: 首页 > article >正文

函数参数:右值引用

右值引用

语法:int && a=320+250

&&不是与符号,也不是引用的引用,而是表示右值引用符号,用来指向右值

void  add(int &a)
{
    std::cout << a;
    return 0;
}
int main()
{
    int c = 12 + 11;
    add(11+11+c);
}

这种方式是错误的,因为引用实际上是指针,而11+11+c没有固定的内存,查看一下c+11+11的内存

    int c = 12 + 11;
00C04EAC  mov         dword ptr [c],17h  
    add(c+11+11);
00C04EB3  mov         eax,dword ptr [c]  
00C04EB6  add         eax,16h  
00C04EB9  push        eax  

从这里可以看出,第五行表示eax=eax+16h,所以这个11+11+c被放在了寄存器里面

左值和右值的区分

一种说法是等号左边的就是左值,右边的为右值,这种说法大部分情况都适用,另一种说法是有自己固定的内存,能往里面写入数据的称为左值,没有固定内存的,临时找了个内存,不能写入的称为右值,比如11+11+c不能再给它赋值了

举个简单的例子

struct Role
{
    int hp;
    int mp;
};
Role create()
{
    Role rt{ 00,100 };
    return rt;
}
void ShowRole(Role&& role)
{
    std::cout << role.hp;
}
int main()
{
    ShowRole(create());
    system("pause");
}

这种,第11行代码就要用到右值引用,这里create返回的是一个局部变量rt,下面用ShowRole接收后,,如果写成void ShowRole(Role  role),就相当于再声明一个Role来保存,就造成内存浪费,可以用右值引用,就相当于直接接收了rt


http://www.kler.cn/a/6978.html

相关文章:

  • Jaskson处理复杂的泛型对象
  • SpringBoot Data Redis连接Redis-Cluster集群
  • 【网页设计】CSS3 进阶(动画篇)
  • RabbitMQ教程:发布/订阅模式(Publish/Subscribe)(三)
  • Linux守护Pythom脚本运行——Supervisor学习总结
  • Gin 框架入门(GO)-1
  • 【分布式】HLC 混合逻辑时钟
  • 45了解容器编排工具 Kubernetes 的基本概念和应用,包括 Pod、Service
  • 上传了ipa但在苹果App Store中没有看到构建版本的问题
  • Java对象回收
  • SpringCloud Alibaba 学习圣经,10万字实现 SpringCloud 自由
  • 蓝桥杯赛前冲刺-枚举暴力和排序专题2(包含历年蓝桥杯真题和AC代码)
  • Java阶段一Day18
  • 【华为机试真题详解JAVA实现】—简单错误记录
  • TCP协议内部工作机制一(确认应答,超时重传,连接管理)
  • 工作实战:Vue关于ElementUI二次封装的问题
  • 机器学习-卷积神经网络CNN中的单通道和多通道图片差异
  • C++ primer plus(第六版)编程练习答案 第13章 类继承
  • pytorch拓展——Ubuntu vscode配置pytorch C++拓展环境
  • docker-compose:Dockerfile参数以及说明
  • 【独家】华为OD机试 - 机智的外卖员(C 语言解题)动态规划
  • 前端已死?金三银四?你收到offer了吗?
  • 基于dbt的机器学习:流畅的过程衔接
  • 计算机网络基础
  • java servlet 期刊在线投稿系统jsp编程sqlserver数据库mvc模式开发计算机网页设计
  • js 作用域