C++笔记之左值与右值、右值引用
code review!
文章目录
- C++笔记之左值与右值、右值引用
- 1.左值与右值
- 2.右值引用——关于int&& r = 10;
- 3.右值引用——对比int&& r = 10;和int& r = 10;
- 4.右值引用(rvalue reference)的概念
1.左值与右值
2.右值引用——关于int&& r = 10;
当声明 int&& r = 10;
时,发生了以下操作:
1. int&& r
: 这是一个声明语句,它创建了一个名为 r
的变量,其类型是一个右值引用。int&&
表示这是一个指向 int
类型的右值引用。
2. = 10
: 这是一个赋值操作,将右边的表达式的值分配给左边的变量。
因此,int&& r = 10;
声明了一个名为 r
的变量,它是一个右值引用,然后将整数值 10
赋值给了这个变量。
现在让我们来详细解释这个代码:
1. int&& r
: 这部分声明了一个名为 r
的变量,它是一个右值引用。右值引用允许 r
绑定到一个右值(临时值)。在这里,r
是一个指向 int
类型的右值引用。
2. = 10
: 这部分将右边的表达式的值分配给左边的变量 r
。右边的表达式是 10
,它是一个字面量整数,因此是一个右值。
综合起来,int&& r = 10;
表示将整数值 10
绑定到一个右值引用 r
。因为 10
是一个右值,而 r
是一个右值引用,所以这个赋值是有效的。
这样的声明和赋值操作实际上是在C++中利用右值引用的一个典型用例。“右值引用允许您在不复制数据的情况下绑定到临时值,这对于实现移动语义和高效资源管理非常有用”。在这个例子中,r
是一个指向右值 10
的引用,因此您可以在代码中使用 r
,就像您在使用常规引用一样。
3.右值引用——对比int&& r = 10;和int& r = 10;
让我们对比一下上述两行代码,分别使用右值引用和常规引用来初始化变量:
1. int&& r = 10;
这行代码声明了一个名为 r
的变量,它是一个右值引用。10
是一个右值,因为它是一个字面量,没有具名的内存位置。r
是一个指向 int
类型的右值引用,因此它可以绑定到右值。这里我们创建了一个右值引用 r
并将其绑定到右值 10
。
2. int& r = 10;
这行代码声明了一个名为 r
的变量,它是一个常规引用。10
是一个右值,但是在这里,它被绑定到一个常规引用 r
,这在语法上是合法的。然而,这样的代码是危险的,因为右值引用(包括常规引用)通常用于捕获左值(即具名的内存位置),以便可以使用它们。将右值直接绑定到常规引用可能导致悬空引用,因为 10
是一个临时值,一旦表达式结束,它将不再存在。
在实际使用中,常规引用应该用于捕获左值,以便能够延长对象的生命周期。右值引用通常用于实现移动语义和完美转发等高级特性。
总结:
- int&& r = 10;
将右值 10
绑定到一个右值引用 r
,在合适的上下文中可以用于实现移动语义和完美转发。
- int& r = 10;
将右值 10
绑定到一个常规引用 r
,这在语法上是合法的,但可能导致悬空引用。通常情况下,常规引用应该用于捕获左值。