首页 > 编程语言 >C++ 右值引用与一级指针

C++ 右值引用与一级指针

时间:2022-10-11 08:22:25浏览次数:88  
标签:const 右值 int C++ 引用 && rrp 指针

右值引用用于一级指针,在初始化时等号右边必须为右值,有以下几种用法:

//方式一:引用一级指针,常规用法
int a = 5;
int * &&rrpa = &a;       //右值:例子一
int * getPx() { return new int; }
int * &&rrpa = getPx();  //右值:例子二
int * pa = &a;
int * &&rrpa = std::move(pa);//右值:例子三

//方式二:引用指向常量的一级指针,以下几种为等效表示
int a = 5;
const int * &&rrpac = &a; //方式一
int const * &&rrpac = &a; //方式二

//方式三:引用一级指针的常引用,引用自身为常量
int a = 5;
int * const &&crrpa = &a;

//方式四:引用指向常量的一级指针,且引用自身为常量,以下几种为等效表示
int a = 5;
const int * const &&crrpac = &a; //方式一
int const * const &&crrpac = &a; //方式二

Microsoft Visual Studio 中连续多个 const 会被编译器解释成一个,即 const const const const int *&&const int *&& 等效,除此之外,const int const *&&Microsoft Visual Studio 中也与 const int *&& 等效,而 int *&& constQT minGW 中将会报错,在 Microsoft Visual Studio 中与 int *&& 等效。

各类型引用可修改属性如下表所示:

引用类型 修改 *rrp 修改 rrp
int * &&rrp 可以 可以
const int * &&rrp 不可以 可以
int * const &&rrp 可以 不可以
const int * const &&rrp 不可以 不可以

若将变量的地址赋予引用(例如 rrp=&x),各类型引用可接受的变量地址如下表所示:

引用类型 int变量地址 const int变量地址
int * &&rrp 可以 不可以
const int * &&rrp 可以 可以
int * const &&rrp 声明时可以 不可以
const int * const &&rrp 声明时可以 声明时可以

若将函数返回的一级指针值赋予引用(例如 rrp=getPx()),或者使用形如 rrp=(const int *) &x 的强制类型转换,此时各类型引用可接受的类型如下表所示:

引用类型 int * const int * int * const const int * const
int * &&rrp 可以 不可以 可以 不可以
const int * &&rrp 可以 可以 可以 可以
int * const &&rrp 声明时可以 不可以 声明时可以 不可以
const int * const &&rrp 声明时可以 声明时可以 声明时可以 声明时可以

由于右值引用变量自身为左值,因此不能直接将右值引用变量的值赋予另一个右值引用变量,但可以将函数返回的右值引用值赋予另一个右值引用变量(例如 rrp=getRRPx()),也可以使用 std::move() 将左值转换为右值(例如 rrp=std::move(px)),此时各类型引用可接受的类型如下表所示。比较上下两表可知,它们的差别主要在于最后两列,这是因为 int * constconst int * const 中右边的 const 修饰的是一级指针自身,而 int * const &&const int * const && 中右边的 const 修饰的是右值引用自身,代表的含义不同。

引用类型 int * && const int * && int * const && const int * const &&
int * &&rrp 可以 不可以 不可以 不可以
const int * &&rrp 可以 可以 不可以 不可以
int * const &&rrp 声明时可以 不可以 声明时可以 不可以
const int * const &&rrp 声明时可以 声明时可以 声明时可以 声明时可以

右值引用在声明时是否会创建临时变量,这与具体应用场景有关,可在编译后查看对应的汇编代码,也可参考本人另一篇博客 C++ 右值引用与 const 关键字。关于左值引用与一级指针,可参考本人另一篇博客 C++ 左值引用与一级指针

标签:const,右值,int,C++,引用,&&,rrp,指针
From: https://www.cnblogs.com/young520/p/16778009.html

相关文章

  • C/C++ union联合体介绍
    C/C++union联合体介绍文章参考:https://blog.csdn.net/mooneve/article/details/92703036目录C/C++union联合体介绍1.联合体union简介2.联合体union内存分配与所占空......
  • C/C++基于数据分析的小区电量扩容推荐系统
    C/C++基于数据分析的小区电量扩容推荐系统程序设计题:基于数据分析的小区电量扩容推荐程序出题人:朱立华面向专业:测绘工程及其他理工科专业难度等级:41问题描述老旧小......
  • C++多线程同步技巧(二) ---事件
    简介Windows在线程控制方面提供了多种信号处理机制,其中一种便是使用CreateEvent()函数创建事件,然后使用信号控制线程运行。其中将事件变为有信号可使用SetEvent()函数,将......
  • 理解指针
    title:理解指针excerpt:大佬语录:只要最后功能对,就是对的~tags:[c语言,指针,指针变量]categories:[学习,C语言]index_img:https://picture-store-repository.o......
  • vscode——如何在vscode中运行C/C++
    前言mingw-w64:https://sourceforge.net/projects/mingw-w64/files/mingw-w64/内容安装mingw-w64下载地址x86_64-8.1.0-release-win32-sjlj-rt_v6-rev0.7z:x86_64-8.1......
  • C++和Java多维数组声明和初始化时的区别与常见问题
    //C++只有在用{}进行初始化的时候才可以仅仅指定列数而不指定行数,因为可以通过直接//初始化时的元素个数自动计算出行数。而仅声明/创建数组而不初始化时,Cpp要求必须写明//......
  • C++算术表达式求值
    C++算术表达式求值二、实验内容:设计一个程序,用算符优先法对算术表达式求值。三、基本要求:以字符序列的形式从终端输入语法正确的、不含变量的算术表达式,利用算符优先......
  • C++ Primer Plus学习笔记之预备知识
    前言个人觉得学习编程最有效的方法是阅读专业的书籍,通过阅读专业书籍可以构建更加系统化的知识体系。一直以来都很想深入学习一下C++,将其作为自己的主力开发语言。现在为......
  • Microsoft Visual C++ 14.0 免费下载
    ​​https://pan.baidu.com/s/1uGOeqwpAO1RleXmTFt2Hrg ​​提取码:5zyd......
  • GitHub 开源推荐 | 一个轻量级、高性能的 C++ Web 框架
     Github开源推荐​​专注分享GitHub上有趣、好玩的开源项目,​​以帮助大家提高编程技巧,找到编程乐趣。如果你对开源感兴趣,想和大家分享一些优质项目,随时欢迎投稿(微信号:i......