首页 > 其他分享 >左值,右值,引用,指针,常量,auto如何组合?

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

时间:2023-08-06 16:12:54浏览次数:35  
标签:常量 右值 auto 左值 引用 && 指针

左值,右值,引用,指针,常量,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,左值,引用,&&,指针
From: https://www.cnblogs.com/fireinstone/p/17609510.html

相关文章

  • spring boot自定义类中 @Autowired注入失败问题小记
    springboot自定义类中@Autowired注入失败问题小记第一种方法:@PostConstruct,大多数人使用的方式,不过对于我的问题没有用第二种方法:实现ApplicationRunner接口,在run方法执行后进行初始化第三种方法:实现ApplicationContextAware接口,直接到spring容器拿bean代码如下shiroConf......
  • 构造函数,移动语义move与右值引用
    构造函数C++的构造函数包含一般构造函数,拷贝构造函数与移动构造函数。拷贝构造函数其中包含浅拷贝和深拷贝(此处以深拷贝为例),主要是通过将已存在的对象的所有成员拷贝给新对象,来实现对新对象的初始化。这样就会存在两个一样的对象,相当于内存中存在两份。拷贝构造函数的参数......
  • k8s 学习笔记之 Pod 控制器——Horizontal Pod Autoscaler(HPA)
    在之前的学习中,我们已经可以实现通过手工执行kubectlscale命令实现Pod扩容或缩容,但是这显然不符合Kubernetes的定位目标——自动化、智能化。Kubernetes期望可以实现通过监测Pod的使用情况,实现pod数量的自动调整,于是就产生了HorizontalPodAutoscaler(HPA)这种控制器。......
  • automate-dv 基于dbt 的data vault 2.0 落地工具
    automate-dv基于dbt的datavault2.0落地工具,包装了不少方便的宏,可以方便我们呢进行datavault2.0数据仓库建模理论的实际落地功能企业级保障支持datavault的hub,links,satelintes以及一些扩展(方便使用)元数据驱动的代码生成dbt包配置支持多平台支持,支持多种数据库平......
  • [Typescript] Partial autocompletion (string & {})
    constpresetSizes={xs:"0.5rem",sm:"1rem",};typeSize=keyoftypeofpresetSizes;//typeLooseSize=Size|string;//theresultwillbestringtypeLooseSize=Size|(string&{});//workingexportconstIcon=(pr......
  • IOC认识及Autofac使用
    依赖注入学习DIP(DependencyInversion Principle)依赖倒置原则:上层模块不应该依赖于底层模块,二者应该通过抽象来依赖,依赖抽象而不是依赖细节。换言之,要针对接口编程,而不是针对实现编程。IOC(InversionofControl)控制反转:面向对象编程中的一种设计原则,可以用来减低计算机代......
  • 7.说说你了解的auto_ptr作用
    7.说说你了解的auto_ptr作用1.auto_ptr的出现,主要是为了解决“有异常抛出时发生内存泄漏”的问题;抛出异常,将导致指针p所指向的空间得不到释放而导致内存泄漏;2.auto_ptr构造时取得某个对象的控制权,在析构时释放该对象。我们实际上是创建一个auto_ptr<Type>类型的局部对象,该局部对......
  • 2.auto、decltype和decltype(auto)的用法
    2.auto、decltype和decltype(auto)的用法1.auto编程时常常需要把表达式的值赋给变量,这就要求声明变量时清楚的知道表达式的类型。然而有些情况是声明的变量的类型我们并不知道,比如在模板编程时。为了解决这个问题,C++11引入了auto类型说明符,用它来让编译器替我们去分析表达式所属......
  • .NET Core如何使用第三方容器Autofac
    首先先了解一下什么是AutofacAutofac用于在.NETCore应用程序中管理组件的生命周期和依赖关系。我们在开发一个项目的时在Program中注入依赖注入的生命周期,项目工程比较大的时候我们就要实现很多注入,最致命的缺点就是耽误太多时间,为解决这一问题的最好解决方法就是使用到Autof......
  • @Autowired 和 @Resource的区别
    @Autowired和@Resource都可以用于注入Bean对象,并且都可以自动装配依赖关系,但他们主要的区别在于:1.使用的注解不同@Autowired是Spring提供的注解,而@Resource是JSR-250规范提供的注解。2.默认情况下注入的方式不同@Autowired默认按照类型装配依赖对象,当发现有多个Bean满足依......