左值,右值,引用,指针,常量,auto如何组合?

  • 左值引用:int &a = b;

    • 左值引用是通过使用&符号来声明的,例如int &a
    • 左值引用用于绑定到左值(可标识的、持久的、具名的),a绑定到b。
    • 左值引用允许对其绑定的对象进行修改。
    • 使用左值引用可以实现函数参数的传递和返回值的传递,以及在函数中进行对象的修改。
    • 注意:如果b是一个临时对象,a就不能绑定到b,可以使用常量左值引用:编译器会创建一个临时的常量对象,并将右值的值复制到该临时对象中。
  • 右值引用: int &&a = b;

    • 右值引用是通过使用&&符号来声明的,例如int &&a

    • 右值引用用于绑定到右值b(临时的、匿名的、即将销毁的)。

    • 右值引用通常用于实现移动语义和完美转发。

      • 移动语义允许在对象之间高效地转移资源,而不是进行昂贵的拷贝操作。

      • 完美转发允许保持传递给函数的参数的值类别(左值或右值),以便将其转发到其他函数。

  • 常量左值引用:

    • 常量左值引用是通过使用const修饰符和&符号声明的,例如const int &a
    • 常量左值引用用于绑定到左值,并且不允许修改绑定的对象。(也可以绑定到右值,但是不是真正的绑定到右值,而是创建一个临时常量对象复制右值的值到该对象中)
    • 常量左值引用常用于函数参数中,以接受常量或临时对象,并避免对象的拷贝。
  • 常量右值引用(×):

    • 常量右值引用是一个错误的术语,因为常量对象的值是不可修改的,没有必要将其绑定到右值引用上。
    • 右值引用本身可以是常量,例如const int &&a,但在实际使用中不常见。
  • 指针常量:(const离*近说明指针是常量,const离名字ptr近,说明ptr是常量)

    • 指针常量是指:指针本身是一个常量,即指针的值不可修改。
    • 声明指针常量时在*之前添加const关键字,例如const int* ptr
    • 指针常量可以指向可变对象,但不能通过指针修改对象的值。但可以通过其他的指针或者引用来修改此值。
  • 常量指针:

    • 常量指针是指指针指向的对象是一个常量,即指针所指向的值不可修改。
    • 声明常量指针时在*之后添加const关键字,例如int* const ptr
    • 常量指针本身的值可以修改,即可以指向不同的对象,但不能通过指针修改对象的值。
  • auto && a为什么是万能转发:

    • auto &&是一种引用折叠(reference collapsing)的语法,用于实现完美转发。

      引用折叠: A& & 变成 A&

      A& &&变成 A&

      A&& & 变成 A&

      A&& && 变成 A&&

    • auto &&用于模板函数参数类型时,它可以保持传递给函数的参数的值类别(左值或右值)。

  • std::move什么时候使用

    • 移动语义作用是将一个对象的资源转移到另外一个对象, 这过程中避免了拷贝,节省了内存资源;通过std::move与右值引用即可实现移动语义;

    • std::move是一个函数模板,用于将一个左值转换为对应的右值引用。当将一个对象标记为右值引用时,实际上只是改变了对象的类型,使其成为右值引用类型。对象本身的内存地址并没有改变。(并不是说因为右值没有内存地址,右值引用就会改变对象的内存地址)

    • 使用std::move可以显式地表示对象的所有权转移或资源移动的意图。

    • 通常在使用移动语义的情况下使用std::move,例如在移动构造函数和移动赋值运算符中。

  • ​ 左值与右值:根本区别:左值可以取地址,而右值是没有存放在实际的地址空间里面的,一般是运算过程的中间值,他可能是寄存器里面的立即数等。总之他不放在地址空间中,因此不能对其取地址,自然也不能对他进行赋值了。

左值,右值,引用,指针,常量,auto如何组合?的更多相关文章

  1. C++ 左值与右值 右值引用 引用折叠 => 完美转发

    左值与右值 什么是左值?什么是右值? 在C++里没有明确定义.看了几个版本,有名字的是左值,没名字的是右值.能被&取地址的是左值,不能被&取地址的是右值.而且左值与右值可以发生转换. ...

  2. C++11之右值引用(一):从左值右值到右值引用

    C++98中规定了左值和右值的概念,但是一般程序员不需要理解的过于深入,因为对于C++98,左值和右值的划分一般用处不大,但是到了C++11,它的重要性开始显现出来. C++98标准明确规定: 左值是 ...

  3. 左值&右值

    一.引子 我们所谓的左值.右值,正确的说法应该是左值表达式.右值表达式. 因为C++的表达式不是左值就是右值. 在C中,左值指的是既能够出现在等号左边也能出现在等号右边的表达式,右值指的则是只能出现在 ...

  4. C语言几个术语: 数据对象,左值,右值

    1. 数据对象 赋值表达式语句的目的是把值存储到内存位置上. 用于存储值的数据存储区域统称为数据对象. 2. 左值 左值是C语言的术语, 用于标识特定数据对象的名称或表达式. 对象指的是实际的数据存储 ...

  5. c++ 左值右值 函数模板

    1.先看一段代码,这就是一种函数模板的用法,但是红色的部分如果把a写成a++或者写成一个常量比如1,都是编译不过的,因为如果是a++的话,实际上首先是取得a的 值0,而0作为一个常量没有地址.写成1也 ...

  6. C++ 左值 右值

    最近在研究C++ 左值 右值,搬运.收集了一些别人的资料,供自己记录和学习,若以后看到了更好的解释,会继续补充.(打“?”是我自己不明白的地方 )   参考:<Boost程序库探秘——深度解析C ...

  7. C和C指针小记(八)-操作符、左值右值

    1.移位操作符 移位操作符分为左移操作符(<<)和右移操纵符(>>) 对于无符号数:左右位移操作都是逻辑位移 对于有符号数:到底是采用逻辑位移还是算术位移取决于编译器.如果一个 ...

  8. i++和++i以及左值,右值

    左值(LValue)和右值(RValue)的一个快捷记法是赋值运算,左值是赋值运算左边的值,右值就是右边(=,=废话).例如: int a = 5; a就是左值,5就是右值. 当然,如果真是这么个含义 ...

  9. 详解 C++ 左值、右值、左值引用以及右值引用

    一.左值和右值 1.左值 [可以取地址的对象就是左值] 左值是一个表示数据的表达式,比如:变量名.解引用的指针变量.一般地,我们可以获取它的地址和对它赋值,但被 const 修饰后的左值,不能给它赋值 ...

  10. MordernC++之左值(引用)与右值(引用)

    左值与右值 C++中左值与右值的概念是从C中继承而来,一种简单的定义是左值能够出现再表达式的左边或者右边,而右值只能出现在表达式的右边. int a = 5; // a是左值,5是右值 int b = ...

随机推荐

  1. 【算法】Java版

    二分查找算法 二分查找算法(Binary Search Algorithm)是一种在有序数组中查找特定元素的搜索算法.该算法的基本思想是将数组从中间分成两部分,然后与目标元素进行比较,进而确定目标元素 ...

  2. Windows下使用图形化的Havoc C2

    Windows下使用图形化的Havoc C2 前言 这几天用goland去连虚拟机去coding真的心累,想着搞个wsl算了虽然测试又变麻烦了(wsl2和VMware一起开有问题,可能保存不了快照), ...

  3. CUDA驱动深度学习发展 - 技术全解与实战

    全面介绍CUDA与pytorch cuda实战 关注TechLead,分享AI全维度知识.作者拥有10+年互联网服务架构.AI产品研发经验.团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云 ...

  4. 神经网络优化篇:详解Mini-batch 梯度下降(Mini-batch gradient descent)

    Mini-batch 梯度下降 机器学习的应用是一个高度依赖经验的过程,伴随着大量迭代的过程,需要训练诸多模型,才能找到合适的那一个,所以,优化算法能够帮助快速训练模型. 其中一个难点在于,深度学习没 ...

  5. 文心一言 VS 讯飞星火 VS chatgpt (62)-- 算法导论6.5 1题

    文心一言 VS 讯飞星火 VS chatgpt (62)-- 算法导论6.5 1题 一.试说明 HEAP-EXTRACT-MAX在堆A=(15,13,9,5,12,8,7,4,0,6,2,1)上的操作 ...

  6. JavaScript异步编程4——Promise错误处理

    目录 1. 概述 2. 详论 3. 参考 1. 概述 在上一篇文章<JavaScript异步编程3--Promise的链式使用>中,通过Promise的链式使用,避免程序中多次嵌套回调(回 ...

  7. MPU:鸿蒙轻内核的任务栈的溢出检察官

    摘要:MPU(Memory Protection Unit,内存保护单元)把内存映射为一系列内存区域,定义这些内存区域的维洲,大小,访问权限和内存熟悉信息. 本文分享自华为云社区<鸿蒙轻内核M核 ...

  8. 斗罗大陆真3D手游实力上线,带你感受魂兽猎杀的超燃时刻

    摘要:在华为云数据库支撑该游戏的仅两个月内就完成了游戏内测至上线的全流程,业务上线流程缩短50%,并支撑海量游戏用户同时在线,达到了200万的用户预约量,上线首日流水破1000万. "没有废 ...

  9. 如何构建面向海量数据、高实时要求的企业级OLAP数据引擎?

    在字节跳动各产品线飞速成长的过程中,对数据分析能力也提出了更高的要求,现有的主流数据分析产品都没办法完全满足业务要求.因此,字节跳动在ClickHouse引擎基础上重构了技术架构,实现了云原生环境的部 ...

  10. 对不起,你做的 A/B 实验都是错的——火山引擎 DataTester 科普

    DataTester 是火山引擎数智平台旗下产品,能基于先进的底层算法,提供科学分流能力和智能的统计引擎,支持多种复杂的 A/B 实验类型.DataTester 深度耦合推荐.广告.搜索.UI.产品功 ...