c++--右值引用

这篇具有很好参考价值的文章主要介绍了c++--右值引用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.什么是右值引用

在C++11之前,是没有右值引用的,只有左值引用,在C++11中,才更新了右值引用,不管是左值引用还是右指针用,其本质都是为对象起别名。

左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址+可以对它赋值,左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。定义时const修饰符后的左值,不能给他赋值,但是可以取它的地址。左值引用就是给左值的引用,给左值取别名。

比如:

     //左值引用
    int a = 10;
    int& b = a;
    cout << a << " " << b << endl;

右值也是一个表示数据的表达式,如:字面常量、表达式返回值,函数返回值(这个不能是左值引
用返回)等等,右值可以出现在赋值符号的右边,但是不能出现出现在赋值符号的左边,右值不能
取地址。右值引用就是对右值的引用,给右值取别名。

比如:

    //右值引用
    10;
    int&& a = 10;
    int x = 10;
    int y = 20;
    x + y;
    int&& z = x + y;
    cout << a << endl;
    cout << z << endl;

需要注意的是右值是不能取地址的,但是给右值取别名后,会导致右值被存储到特定位置,且可
以取到该位置的地址,也就是说例如:不能取字面量10的地址,但是a引用后,可以对a取地址,也可以修改a。如果不想a被修改,可以用const int&& a去引用,是不是感觉很神奇,这个了解一下实际中右值引用的使用场景并不在于此,这个特性也不重要。


2.左值引用与右值引用的比较

1.左值引用不能引用右值,但加const之后可以引用,即const左值引用即可以引用左值,也可以引用右值。

2.右值引用不能引用左值,但是右值引用可以引用·move之后的左值。

比如:

    int a = 10;
    int& b = a;
    20;
    //左值引用
    const int& c = 20;
    //右值引用
    int&& d = move(a);
    cout << c << " " << d << endl;

3.使用场景

左值引用短板:当函数返回对象是一个局部变量,出了函数作用域就不存在了,就不能使用左值引用返回,只能传值返回。例如:bit::string to_string(int value)函数中可以看到,这里只能使用传值返回,传值返回会导致至少1次拷贝构造(如果是一些旧一点的编译器可能是两次拷贝构造)。

右值引用做返回值和参数可以提高效率,在bit::string中增加移动构造,移动构造本质是将参数右值的资源窃取过来,占位已有,那么就不用做深拷贝了,所以它叫做移动构造,就是窃取别人的资源来构造自己。在bit::string类中增加移动赋值函数,再去调用bit::to_string(1234),不过这次是将bit::to_string(1234)返回的右值对象赋值给ret1对象,这时调用的是移动构造。

按照语法,右值引用只能引用右值,但右值引用一定不能引用左值吗?因为:有些场景下,可能真的需要用右值去引用左值实现移动语义。当需要用右值引用引用一个左值时,可以通过move函数将左值转化为右值。C++11中,std::move()函数位于 头文件中,该函数名字具有迷惑性,它并不搬移任何东西,唯一的功能就是将一个左值强制转化为右值引用,然后实现移动语义。文章来源地址https://www.toymoban.com/news/detail-643467.html

到了这里,关于c++--右值引用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++右值引用(左值表达式、右值表达式)(移动语义、完美转发(右值引用+std::forward))(有问题悬而未决)

    在 C++ 中,表达式可以分为左值表达式和右值表达式。左值表达式指的是可以出现在赋值语句左边的表达式,例如变量、数组元素、结构体成员等;右值表达式指的是不能出现在赋值语句左边的表达式,例如常量、临时对象、函数返回值等。 右值是指将要被销毁的临时对象或

    2024年02月04日
    浏览(34)
  • 【C++11】左值引用和右值引用

    需要云服务器等云产品来学习Linux的同学可以移步/--腾讯云--/--阿里云--/--华为云--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。     目录 一、新的类功能 1、新的默认成员函数 2、类成员变量初始化 3、强制生成默认函数的default 4、禁止生成默认函

    2023年04月17日
    浏览(35)
  • C++右值引用(&&)

    右值引用是 C++11 新增的特性之一,它是我们在日常开发工作中不断接触到的特性之一。本篇博客将对右值引用的定义、使用场景以及使用方法进行详细介绍。 右值引用是一种新的引用类型,“右值引用” 又被称为“具名右值引用”(Named Rvalue Reference),其定义形式为:Type v

    2024年02月07日
    浏览(29)
  • 【C++】右值引用

    引用是给对象取别名,本质是为了减少拷贝 。以前我们学习的引用都是左值引用,右值引用是C++11新增的语法,它们的共同点都是给对象取别名。既然如此,有了左值引用,为什么还要有右值引用?右值引用具体是怎样的?以及它有哪些应用场景?接下来,会详细分析~~ 左值

    2024年04月11日
    浏览(28)
  • c++--右值引用

    1.什么是右值引用 在C++11之前,是没有右值引用的,只有左值引用,在C++11中,才更新了右值引用,不管是左值引用还是右指针用,其本质都是为对象起别名。 左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址+可以对它赋值,左值可以出现赋值

    2024年02月13日
    浏览(16)
  • 右值引用解释

    C++11新增加的引用——右值引用(rvalue reference),使用声明 作用:只能引用临时变量和常量值 int main() {         double a = 11.1;         //double a1 = a*2+10.0;//错误,不能引用临时变量         double ra = a*2 + 10.0;//合法         double b1 = sqrt(100);//错误,不能引用临时变量        

    2024年01月18日
    浏览(22)
  • 【送书】【C++11】左值引用和右值引用

    需要云服务器等云产品来学习Linux的同学可以移步/--腾讯云--/--阿里云--/--华为云--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。     目录 一、新的类功能 1、新的默认成员函数 2、类成员变量初始化 3、强制生成默认函数的default 4、禁止生成默认函

    2023年04月09日
    浏览(27)
  • 初识C++之左值引用与右值引用

    目录 一、左值引用与右值引用 1. 左值和右值的概念 1.1 左值 1.2 右值  1.3 左值与右值的区分 2. 左值引用与右值引用 2.1 左值引用与右值引用的使用方法 2.2 左值引用的可引用范围 2.3 右值引用的可引用范围 3. 右值引用的作用 3.1 减少传值返回的拷贝 3.2 插入时的右值引用 4

    2023年04月26日
    浏览(28)
  • 左值引用、右值引用,std::move() 的汇编解释

    1:左值引用 引用其实还是指针,但回避了指针这个名字。由编译器完成从地址中取值。以vs2019反汇编: 如图,指针和引用的汇编代码完全一样。但引用在高级语言层面更友好,对人脑。比如可以少写一个 * 号和 - 。 ,以下是指针和引用的使用: 以上就是左值引用,引用的

    2024年02月04日
    浏览(29)
  • 【C++】右值引用(极详细版)

    在讲右值引用之前,我们要了解什么是右值?那提到右值,就会想到左值,那左值又是什么呢? 我们接下来一起学习!   目录 1.左值引用和右值引用 1.左值和右值的概念 2.左值引用和右值引用的概念 2.左值引用和右值引用引出 3.右值引用的价值 1.补齐左值引用的短板——函

    2024年02月11日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包