C++ 右值引用和左值引用
C++ 右值引用和左值引用
C++中所有的值必属于左值和右值。引入右值引用主要是为了提高程序性能,避免不必要的内存拷贝,将资源无代价地转移给另一个所有。使用右值引用可以将右值的生命周期延长至右值引用的生命周期。
左值: 传统C++引用都是左值引用,可以被获取地址的变量都是左值
右值: 不能被获取地址的变量都是右值,右值又分为纯右值和将亡值
纯右值: 临时变量和不被关联的字面变量,临时变量如一般的函数返回值
将亡值: 将要被移动的变量(移为他用),如返回值为T&&的函数,std::move()函数操作的变量,强制转为T&&的变量
copy//以下均为将亡值 int&& getRightValue() { //.... return 10; } int ia = 10; int &&ira = std::move(ia); // 转移ia的内存所有权
copyint getInt() { return 1; } int main() { int ia = 10; const ica = 15; int& ria = ia; // 正确 左值赋值给左值引用 const& rcia1 = ia;//正确 左值赋值给常量左值引用 const& rcia2 = ica;//正确 常量左值赋值给左值引用 int& ia2 = 10; //错误 右值无法赋值给左值引用 int& ia3 = getInt();//错误 函数返回值为临时变量(纯右值) int&& ita = getInt(); //正确 纯右值可以赋值给右值引用 int&& ita2 = 10;//正确 右值可以赋值给右值引用 int&& ita3 = std::move(ia); //正确 std::move()操作的值返回为将亡值,可以赋值给右值引用 // const引用可以适配任何类型 }
右值引用的特征
-
右值引用延长临时变量的生命周期,右值的生命周期与右值引用存在的日期一致
-
右值引用独立于左值和右值。意思是右值引用类型的变量可以是左值也可以是右值(不能用左值来初始化右值引用,但是以右值引用为参数的函数可以传入左值)
-
T&& a类型的函数参数,它的具体类型取决于它的初始化
-
右值不可以获取地址,但是右值引用可以取地址,代表临时变量的地址
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步