文章目录
C++11 引入了右值引用,这是 C++ 语言的一个重要特性,其目的是为了提高程序的性能,尤其是在对象的传递和资源管理方面。与左值引用相比,右值引用解决了在传返回值时的不足,显著减少了不必要的拷贝,提高了效率。
右值和左值的基本概念
在 C++ 中,表达式的值可以分为左值和右值两种类型:
左值
:表示一个持久存在的对象或者内存位置,通常在赋值语句的左侧出现,并且具有可以取地址的特性。例如:变量、数组元素、解引用等都是左值。
//以下均是左值
//变量
int a = 3;
int* pa = &a;
const int b = a;
int* ptr = new int(3);
//解引用
*ptr = 4;
//数组元素
string str("abcdef");
str[0];
右值
:表示临时对象、字面量常量或者表达式的结果,通常只能出现在赋值语句的右侧,具有不可取地址的特性。右值是没有名称的、即将被销毁的对象。
int a = 4, b = 5;
//以下均是右值
100;
a + b;
fmin(x, y);
string("qwer");
左值引用和右值引用
引用本质上是给对象取别名,右值引用就是给右值取别名,左值引用就是给左值取别名。右值引用
和左值引用
在语法形式上是类似的:
Type& ref = x; //左值引用
Type&& rref = y; //右值引用
可以看到,左值引用使用 &
,而右值引用使用 &&
。
//左值
int a = 3;
int* pa = &a;
const int b = a;
int* ptr = new int(3);
//左值引用
int& ra = a;
int*& rpa = pa;
const int& rb = b;
int* rptr = ptr;
int a = 4, b = 5;
//右值
//100;
//a + b;
//fmin(x, y);
//string("qwer");
//右值引用
int&& rr1 = 100;
int&& rr2 = a + b;
int&& rr3 = fmin(a, b);
string&& rr4 = string("qwer");
对右值引用的理解:右值本质上是一种生命周期很短的对象(将亡值),而右值引用实际上是将该对象的地址保存,该对象就不会立即销毁,延长了生命周期。
一般而言,右值引用只能引用右值,左值引用只能引用左值,但在特殊情况下,右值引用可以引用左值,左值引用也可以引用右值。
- 左值引用去引用右值:需要在前面加
const
修饰。 - 右值引用去引用左值:需要对左值进行
move
。
//左值引用去引用右值,需要加const
const int& r1 = 10;
const string& r2 = string("abcd");
//右值引用求引用左值,需要对左值move
int x = 3;
int&& rr1 = move(x);
string str("1234");
string&& rr2 = move(str);
左值引用在特定条件下可以引用右值,这一点在前面其实也有所涉及,之前模拟实现容器(如 vector、list等)的 push_back
函数:void push_back (const T& x)
,加 const
是为了让 x
既能接收左值也能接收右值。
move
本质上就是强制类型转换,不会改变左值对象本身的属性。
template
typename remove_reference::type&& move (T&& arg) noexcept;
{
return static_cast::type&&>(arg)
}
右值引用的主要用途
在右值
文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/4603.html