美文网首页
左值/右值&左值引用/右值引用

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

作者: 里里角 | 来源:发表于2018-08-25 08:50 被阅读14次

    左值/右值

    <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的右值引用

    相关文章

      网友评论

          本文标题:左值/右值&左值引用/右值引用

          本文链接:https://www.haomeiwen.com/subject/ocuwiftx.html