左值引用和右值引用
2017-10-22 11:01
246 查看
左值引用和右值引用
为了支持移动语义和完美转发,C++标准引入了一种新的引用类型——右值引用(rvalue reference)。为了与右值引用区分开来,我们将常规引用称为左值引用(lvalue reference)。
对于左值引用而言,我们不能将其绑定到要求类型转换的表达式,字面值常量或是返回右值的表达式。
但是对于右值引用而言,情况则完全相反。我们可以将一个右值引用绑定到字面值常量或是返回右值的表达式上,但是不能将一个右值引用直接绑定到一个左值上。
返回引用的函数,连同赋值、下标、解引用以及前置递增/递减运算符,都是返回左值的表达式的例子。我们可以将一个左值引用绑定到这类表达式的结果上。
返回非引用类型的函数,连同算术、关系、位以及后置递增/递减运算符,都生成右值。我们不能将一个左值引用绑定到这类表达式上,但是我们可以将一个const左值引用或一个右值引用绑定到这类表达式上。
所谓右值引用就是必须绑定到右值的引用。
由前面可知,右值要么是字面值常量,要么是在表达式求值过程中创建的临时对象。
所以,我们得知:
右值引用所绑定的对象将要被销毁。
右值引用所绑定的对象没有其他用户。
这就意味着,右值引用只能绑定一个将要销毁的对象。因此,我们可以从绑定到右值引用的对象“窃取”状态(为移动语义和完美转发作铺垫)。
此外,由于变量是左值,因此我们不能将一个右值引用直接绑定到一个变量上,即使这个变量是右值引用类型也不行。
我们将通过&&而不是&来获得右值引用。
int i = 42; int &r = i; int &&rr = i; //错误,不能将一个右值引用绑定到一个左值上 //cannot bind ‘int’ lvalue to ‘int&&’ int &r2 = i * 42; //错误,不能将一个非const的左值引用绑定到一个右值上 //invalid initialization of non-const reference of type ‘int&’ //from an rvalue of type ‘int’ const int &r3 = i * 42; int &&rr2 = i * 42; int &&rr3 = 42; int &&rr4 = rr3; //错误,不能将一个右值引用绑定到一个左值上,rr3是一个左值 //cannot bind ‘int’ lvalue to ‘int&&’
相关文章推荐
- C++引用(左值引用,右值引用)
- 关于左值右值和左值引用右值引用
- 左值、左值引用、右值、右值引用
- C++ 0x 之左值与右值、右值引用、移动语义、传导模板
- C++11 左值、右值、右值引用详解
- VS2012 error C2664: “std::make_pair”:无法将左值绑定到右值引用
- C++11的右值引用(一)——左值(lvalue),纯右值(prvalue)和将亡值(xvalue)
- 左值与右值,左值引用与右值引用(C++11)
- 非常量引用的初始值必须为左值,常量引用的初始值可以为左值、右值
- c++ 11 移动语义、std::move 左值、右值、将亡值、纯右值、右值引用
- [C++] 左值、右值、右值引用
- C++ 0x 之左值与右值、右值引用、移动语义、传导模板
- 深入理解(实例) -- c++ 右值引用 左值引用
- C++ - 左值(lvalue)引用和右值(rvalue)引用 的 区别
- C++11中,&表示左值引用,&&表示右值引用
- 用汇编解释左值,右值,临时变量和引用
- C++ 0x 之左值与右值、右值引用、移动语义、传导模板(转载)
- 左值和右值引用的一个例子
- c++11 左值引用、右值引用
- C++/C++11中左值、左值引用、右值、右值引用的使用