左值/右值
<C Prime Plus>中,左值的定义为:用于标识一个特定的数据对象(泛指数据存储区)的名字或表达式.
可修改的左值:指能被修改的数据对象.
右值:能赋给可修改的左值的量.
个人理解: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的右值引用