左值/右值&左值引用/右值引用

左值/右值

中,左值的定义为:用于标识一个特定的数据对象(泛指数据存储区)的名字或表达式.

                                                      可修改的左值:指能被修改的数据对象.

                                                        右值:能赋给可修改的左值的量.

个人理解:c中,能在赋值等号左边又能在右边的叫做左值,只能出现在右边的叫做右值.左值能在程序中寻址寻值,右值无法取其地址(不完全对).

                C++中,每个表达式都会产生一个左值或者右值,相应的,产生左值的叫做左值表达式,产生右值的叫做右值表达式.左值在表达式结束后依然存在,右值在表达式结束后会被销毁.

int a = 10; int b = 20;  int *p = &a;  vector T;  T.pushback(1);  string s1 = “Hello”; string s2 = "World"; const int &m =1;

以上,a,b为左值,a+b为右值a++为右值,++a为左值

(1)对于基础类型,右值无法被修改,也无法被const,volatile修饰(与c相同);

(2)对于自定义类型,右值却允许被通过它的成员函数进行修改.(原因:自定义类型允许有成员函数,而通过右值调用成员函数是被允许的,但成员函数有可能不是 const 类型,因此通过调用右值的成员函数,也就可能会修改了该右值)


左值引用/右值引用

左值引用的基本语法:Type &引用名 = 左值表达式;

右值引用的基本语法:Type &&引用名 = 右值表达式;

int a = 10;  

int &&ra(a+1);

例外:如果左值引用是const类型的,则其可以绑定到右值对象上。

const int &r3 = i * 42;//正确,我们可以将一个const的引用绑定到一个右值对象上

例外:对于一个左值,若想使用其右值引用,我们可以用move函数:

int &&rr3 = std::move(rr1);//正确,显式使用rr1的右值引用

你可能感兴趣的:(左值/右值&左值引用/右值引用)