• C++中的左值与右值(二)


      以前以为自己把左值和右值已经弄清楚了,果然发现自己还是太年轻了,下面的这些东西是自己通过在网上拾人牙慧,加上自己的理解写的。

    1. 

     

    2. 怎么区分左值和右值:知乎大神@顾露的回答

    3. 我们不能直接定义一个引用的引用。但是,通过类型别名或通过模板类型参数间接定义是可以的。

        引用折叠只能应用于间接创建引用的引用,如类型别名或模板参数。(C++ Primer 第609页)。

        联想:可以定义指针的指针,也可以定义指针的引用。

    4. move 永远把东西变成右值,而我们可以使用forward传递那些定义为模板类型参数的右值引用的函数参数,通过其返回类型上的引用折叠,

        forward可以保持给定实参的左值/右值属性。

        右值引用和返回值优化经常被很多人混在一起,而且最要命的是如果开了优化的话,其实多半输出的代码是一样的。(via 知乎@vczh)

    5. 具名的右值引用是左值,不具名的右值引用是右值。(将亡值的来源)

        返回不具名的右值引用主要有两种情况:

    1 static_cast<T&&> (t);
    2 T&&  fun
    3 {
    4     return t;          
    5 }

        正是因为返回了将亡值(不具名的右值引用),所以才可以把它们的返回值绑定到一个右值引用上。

        参考:话说C++的左值、右值、将亡值

    6. T&& t (T为模板参数) 在发生自动类型推断的时候,它是未定的引用类型(universal references),如果被一个左值初始化,它就是一个左值;

        如果它被一个右值初始化,它就是一个右值,它是左值还是右值取决于它的初始化。(联想到为模板元编程发明的引用折叠规则)。

        需要注意的是,仅仅是当发生自动类型推导(如函数模板的类型自动推导,或auto关键字)的时候,T&&才是universal references。

      没有自动类型推导的过程中,类型是确定的,是右值引用类型,只能绑定到一个右值上。

        一篇我认为写的非常好的文章:从4行代码看右值引用

     7. 另外,网上介绍的一个VS的 bug 是允许函数返回局部对象的左值引用,这是不符合C++标准的。

         但是可以返回右值引用和const左值引用。

     8. 字面值常量中仅有字符串字面值是左值,可以用&取地址,其他的都是右值。

       

    1  "abc"        //左值,可以取地址
    2  char* ptr = "abc";        //正确的写法
    3  const char* ptr = "abc";        //正确的写法
    4  char a[] = "abc"; char* ptr = a;            //正确的写法
    5  const char* ptr = & "abc"                    //错误的写法

       "abc"可以直接初始化指针const char*,指针的值为字符串"abc"的首字符a的地址,但不能直接初始化char* 指针。(更正,是可以初始化char*指针的)

        而&("abc")被编译器编译为const的指向数组的指针const char (*) [4](之所以是4,是因为 编译器会在"abc"后自动加上一个''),它不能初始化char *类型,即使是           const char *也不行。

      

  • 相关阅读:
    禁止后台运行
    图标的圆角和光晕效果和启动画面
    IOS 开发 有关iPhone程序的安装目录UUID 唯一标识
    NSOperation与performSelectorOnMainThread
    Java web开发学习规划
    JAVA类集
    java 四种xml操作方式的基本使用方法
    用JDOM操作XML文件
    java web 学习
    过去的,将来的
  • 原文地址:https://www.cnblogs.com/niuxichuan/p/5844109.html
Copyright © 2020-2023  润新知