C++11 左值、右值引用

看了这方面的内容,还是一知半解,简单总结一下

左值和右值

简单来讲,左值就是能放在等号左边,也能放在等号右边的值,而右值是只能放在等号右边的值。至于怎么区分,我觉得不需要特意去学习,用得多了自然也就熟悉了。

左值引用

左值引用有两种:左值引用和常左值引用。

  • 左值引用&:只能引用左值
  • 常左值引用const &:可以引用左值和右值
    int x = 1;
    int& y0;  //编译器报错“引用变量需要初始值设定项”
    int& y1 = x;  //可以
    int& y2 = 1;  //编译器报错“非常量引用的初始值必须为左值”
    const int& z0;  //编译器报错“引用变量需要初始值设定项”
    const int& z1 = x;  //可以
    const int& z1 = 1;  //可以

右值引用

  • 只能对右值进行引用
    注意右值引用等号左边的类型必须是具体的类型,不能是auto或者模板参数T
    int x = 1;  
    int&& a0;  //编译器报错“引用变量需要初始值设定项”
    int&& a1 = x;  //编译器报错“无法将右值引用绑定到左值”
    int&& a2 = 1;  //可以
    const int&& b0;  //编译器报错“引用变量需要初始值设定项”
    const int&& b1 = x;  //编译器报错“无法将右值引用绑定到左值”
    const int&& b2 = 1;  //可以

万能引用

万能引用可以是左值引用,也可以是右值引用。具体是那种引用是根据引用对象推导出来的。

  • 引用对象是左值,该万能引用是左值引用


    image.png
  • 引用对象是右值,该万能引用是右值引用


    image.png
  • 存在类型推导才是万能引用,也就是有这两种情况是万能引用:一是有auto,二是存在模板参数T


    image.png
  • 万能引用只能推导引用类型,转换成左值引用或右值引用,并不能转换变量值的类型,也就是说不管等号右边的值是左值还是右值,得到等号左边的值永远是左值
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容