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

C++篇】C++11:右值引用与移动语义

  • 左值:可以获取它的地址+可以对它赋值(修改)定义时const修饰符后的左值,不能给他赋值,但是可以取它的地址。 左值既可以出现在=的左边,也可以出现在右边
  • 右值:右值不能取地址,也不能赋值(修改) 右值可以出现在=的右边,但是不能出现出现在赋值符号的左边

代码语言:javascript

AI代码解释

int fmin(int a, int b) { return a < b ? a : b; } int main() { // 以下都是左值 int* p = new int(0); int b = 1; const int c = 2; "xxxxx";//注意常量字符串也是左值,因为它可以被取地址, const char* p = "xxxxx"; p[2];//字符串字面值具有数组类型,是左值(尽管它是不可修改的左值)。 // 以下几个都是常见的右值 10; x + y; fmin(x, y);//函数的返回值是右值 // 这里编译会报错:error C2106: “=”: 左操作数必须为左值 10 = 1; x + y = 1; fmin(x, y) = 1; return 0; }

什么是左值引用?什么是右值引用?

传统的C++语法中就有引用的语法,而C++11中新增了的右值引用语法特性,所以从现在开始我们之前学习的引用就叫做左值引用。无论左值引用还是右值引用,都是给对象取别名。

  • 对左值的引用就是左值引用,给左值取别名,定义方式:type&
  • 右值引用就是对右值的引用,给右值取别名,定义方式:type&&

代码语言:javascript

AI代码解释

int main() { // 以下的p、b、c、*p都是左值 int* p = new int(0); int b = 1; const int c = 2; // 以下几个是对上面左值的左值引用 int*& rp = p; int& rb = b; const int& rc = c; int& pvalue = *p; double x = 1.1, y = 2.2; // 以下几个都是常见的右值 10; x + y; fmin(x, y); // 以下几个都是对右值的右值引用 int&& rr1 = 10; double&& rr2 = x + y; double&& rr3 = fmin(x, y); return 0; }

需要注意的是:右值是不能取地址的,但给右值取别名后,会导致右值被存储到特定的位置,且可以取到该位置的地址,并且还可以去修改它,如果不想让被引用的右值被修改,可以用const修饰右值引用。

代码语言:javascript

AI代码解释

int main() { double x = 1.1, y = 2.2; int&& rr1 = 10; const double&& rr2 = x + y; rr1 = 20; rr2 = 5.5; //报错 return 0; }

左值引用与右值引用比较

左值引用可以引用右值吗?1. 左值引用只能引用左值,不能引用右值,因为右值是不能被修改的,而左值引用是可以修改,避免权限放大。2. 但是const左值引用既可以引用左值,也可以引用右值。

代码语言:javascript

AI代码解释

int main() { // 左值引用只能引用左值,不能引用右值。 int a = 10; int& ra1 = a; // ra为a的别名 //int& ra2 = 10; // 编译失败,因为10是右值 // const左值引用既可引用左值,也可引用右值。 const int& ra3 = 10; const int& ra4 = a; return 0; }

右值引用可以引用左值吗?1. 右值引用只能引用右值,不能引用左值2. 但是右值引用可以引用move后的左值

代码语言:javascript

AI代码解释

int main() { // 右值引用只能右值,不能引用左值。 int&& r1 = 10; // error C2440: “初始化”: 无法从“int”转换为“int &&” // message : 无法将左值绑定到右值引用 int a = 10; int&& r2 = a; // 右值引用可以引用move以后的左值 int&& r3 = std::move(a); return 0; }

二、 右值引用使用场景和意义

为了更好的说明问题,这里需要借助一个深拷贝的类,下面模拟实现了一个简化版的string类。类当中实现了一些基本的成员函数,并在string的拷贝构造函数和赋值运算符重载函数当中打印了一条提示语句,这样当调用这两个函数时我们就能够知道。

http://www.jsqmd.com/news/477481/

相关文章:

  • 网站无法安装,提示“数据库文件版本号(vX.X.X)与CMS源码版本号(vX.X.X)不一致”问题|已解决
  • 【Matlab】MATLAB教程:cell数组创建与应用(以C={1,‘a‘,[1,2]}为核心案例,聚焦不同类型数据存储)
  • 大规模图神经网络的高效训练新方法
  • php方案 PHP 实现音频指纹识别
  • 旅游从业者必看!旅行社收客系统避坑指南
  • 基于springboot在线商城系统设计与开发.7z(源码+论文)
  • 网站上传大文件时提示“文件过大”“上传失败”,或进度条卡住不动
  • BMJ最新论文解读:如何利用倾向得分方法完美实现组间均衡可比
  • 2026大模型关键元年!告别内卷,从“参数比拼”到“全链赋能”,这3个确定性机会你必须抓住必须抓住
  • MinIO 是什么?和 FTP 有什么区别?
  • 聊聊深圳直流稳压电源制造企业,哪家性价比高? - 工业推荐榜
  • 题解:洛谷 P2005 A/B Problem II
  • Oracle快速生成测试数据:从创建表到主键约束
  • OpenRAG横空出世,集成Langflow+OpenSearch,一文读懂RAG框架终极选型指南
  • 实战案例十一:产品经理效率提升 - PRD 自动生成与竞品分析
  • 益生菌排行榜10大品牌 2026年高活菌款选购指南脆弱肠道人群必看 - 资讯焦点
  • 30 分钟部署 OpenClaw:Windows 系统专属 AI 助手,远程操控更自由
  • php方案 PHP 实现 CAN 总线协议解析 - 汽车电子、工业总线的 DBC 文件解析
  • Winform之SuspendLayout的作用
  • 2026 AI风向标:DeepSeek引爆开源革命,AI Agent成新生产力
  • 2026科技政策申报热门品牌盘点,助力企业高效获取扶持,目前科技政策申报实力厂家精选实力品牌榜单发布 - 品牌推荐师
  • STM32 DIY飞控板 | 四轴飞行器从设计到组装到上天全攻略
  • Cesium全球FFT海洋特效
  • 揭秘软著在评职称中的隐藏加分项!职场晋升必备攻略!
  • 前端项目同时使用svn和gitee管理代码
  • TypeScript 极简指南:那个尖括号 <T> 到底是什么?
  • OpenClaw Channel 对接飞书:从零到一实现企业级 AI 助理
  • 使用 storcli 将 LSI RAID 硬盘从 JBOD 模式改为 RAID 模式
  • 杭州宙宇未来科学技术有限公司靠谱吗?从官方资质看企业实力 - 资讯焦点
  • OpenClaw简介