[作者]
常用网名: 猪头三
出生日期: 1981.XX.XX
企鹅交流: 643439947
个人网站: 80x86汇编小站
编程生涯: 2001年~至今[共24年]
职业生涯: 22年
开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、
开发工具: Visual Studio、Delphi、XCode、C++ Builder、Eclipse
技能种类: 逆向 驱动 磁盘 文件 大数据分析
涉及领域: Windows应用软件安全/Windows系统内核安全/Windows系统磁盘数据安全/macOS应用软件安全
项目经历: 股票模型量化/磁盘性能优化/文件系统数据恢复/文件信息采集/敏感文件监测跟踪/网络安全检测
专注研究: 机器学习、股票模型量化、金融分析
[序言]
在C++的发展历程中, "引用"一直是重要且常用的语言特性. C++98引入的左值引用(lvalue reference)极大地简化了对对象的别名操作. 而在C++11中, "值引"(rvalue reference)的加入则进一步增强了语言的表达能力, 其在"移动语义和完美转发等场景中发挥了关键作用.
[左值引用(Lvalue Reference)]
这是C++早期就存在的“传统”引用, 语法: 类型标识符& 引用名 = 左值表达式. 特点: 必须初始化且只能绑定到左值, 绑定后对引用的操作等同于对原对象的操作.
[右值引用(Rvalue Reference)]
这是C++11引入的新特性, 语法: 类型标识符&& 引用名 = 右值表达式. 特点: 可绑定到右值(如临时变量、字面量、运算结果)
[代码演示]
int int_A = 88; // 普通整型变量, 左值
int& int_A_lRef = int_A; // 左值引用, 绑定到 int_A
int&& int_B_rRef = int_A + 10; // 右值引用, 绑定到运算结果(右值)
int&& int_C_rRef = 88; // 右值引用, 绑定到字面量(右值)
const int& int_C_lRef = int_A * 10; // 常量左值引用, 可绑定到右值(运算结果)
[代码说明]
1. int& int_A_lRef = int_A;
* int_A_lRef为左值引用, 绑定到已有的变量int_A. 对int_A_lRef的修改会直接影响int_A.
2. int&& int_B_rRef = int_A + 10;
* int_A + 10是一个右值表达式, int_B_rRef通过右值引用绑定到该临时结果.
3. int&& int_C_rRef = 88
* 字面量88是右值, 可直接绑定到右值引用int_C_rRef.
4. const int& int_C_lRef = int_A * 10;
虽然int_A * 10产生右值, 但常量左值引用允许绑定到右值, 以延长临时对象的生命周期.
[总结]
左值引用和右值引用在语法上的主要区别是引用符号的不同: 左值引用使用单个&符号, 而右值引用使用双&&符号.
* 左值引用要求右侧的表达式必须有明确的内存地址, 因此只能绑定到左值.
* 右值引用能够绑定到临时对象或没有内存地址的右值.
* 常量左值引用可以绑定到右值, 这使得在只读场景下能够安全地访问临时对象.