zoukankan      html  css  js  c++  java
  • 右值引用

    c++11中引入了右值引用,用&&表示,其中右值引用只能绑定到右值上 ,但可以使用std::move(),或static_cast<T&&>()显式的将左值转换为右值

    int &&a=10;   //Ok,绑定到右值上
    ------------------------------------------
    int a=10;
    int &&b=a;  //error,右值引用不能绑定到左值
    -----------------------------------------------------
    int a=10;
    int &&b=std::move(a);   //ok
    int &&c=static_cast<int&&>(a);   //ok
    int &&a=10;   //Ok,绑定到右值上
    --------------------------------------------------------
    int fun(){return 10;}
    int &&a=fun();   //ok,函数返回值是临时对象,右值
    ----------------------------------------------------------
    int a=10;
    int &&b=a;  //error,右值引用不能绑定到左值
    -----------------------------------------------------
    int a=10;
    int &&b=std::move(a);   //ok
    int &&c=static_cast<int&&>(a);   //ok

    左值引用分两种情况:

    1)

    int a=10;
    int &b=a;   //ok,绑定到左值上
    int &c=10;  //error,不能绑定到右值上

    2)

    int a=10;
    const int b=10;      
    const int &c=a;        //ok,绑定到int型左值
    const int &d=b;       //ok,绑定到const int型左值
    const int &e=10;   //ok,绑定到右值

    引入右值引用的目的:右值通常是一个临时变量,可以对其做任意修改,右值引用可以避免右值使用时涉及到的临时对象构造,拷贝,析构等,减少内存开支,尤其是大型的动态结构作为右值时。因为我们都知道引用是对源对象的操作,而不是产生一个源对象的副本。所以可以通过函数重载,产生一个参数是右值引用的函数,这样当参数是右值时就会调用右值引用版本的函数,避免了左值传参方式产生副本增加的开销。

    例如:

    void fun(int a){cout<<1<<endl;}
    void fun(int &&a){cout<<2<<endl;}
    int main()
    {
    int a=10;
    fun(a);    //输出1,参数为左值
    fun(10);  //输出2,参数为右值
    return 0;
    }

     注:虽然右值引用可以作为函数参数,但其在函数内部,被视为左值,所以当你希望在函数内部将其作为右值使用时,需要用上面提到的方法进行转换

      

  • 相关阅读:
    分布式缓存技术memcached学习(一)——linux环境下编译memcahed
    分布式缓存技术redis学习系列(一)——redis简介以及linux上的安装
    Centos 开启telnet-service服务
    Solr学习总结(四)Solr查询参数
    Solr学习总结(三)Solr web 管理后台
    Solr学习总结(二)Solr的安装与配置
    Solr学习总结(一)Solr介绍
    [tixml]保存,读取
    [ios]安装CocoaPods及使用详解
    MKAnnotationView和MKPinAnnotationView的区别
  • 原文地址:https://www.cnblogs.com/mrlsx/p/5512547.html
Copyright © 2011-2022 走看看