C++ 右值引用与一级指针
将右值引用用于一级指针,在初始化时等号右边必须为右值,有以下几种用法:
//方式一:引用一级指针,常规用法
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 *&& const
在 QT 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 * const
与 const 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++ 左值引用与一级指针。
C++ 右值引用与一级指针的更多相关文章
- C++ 左值引用与一级指针
将**左值引用**用于**一级指针**时,有以下几种用法: ```c++ //方式一:引用一级指针,常规用法 int a = 5; int * pa = &a; int * &rpa ...
- C++智能指针之shared_ptr与右值引用(详细)
1. 介绍 在 C++ 中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露.解决这个问题最有效的方法是使用智能指针(smart pointer).智能指针是存储指向动态分配(堆)对象指针 ...
- <五>掌握左值引用和初识右值引用
1:C++的引用,引用和指针的区别? 1:从汇编指令角度上看,引用和指针没有区别,引用也是通过地址指针的方式访问指向的内存 int &b=a ; 是需要将a的内存地址取出并存下来, b=20; ...
- c++11的右值引用、移动语义
对于c++11来说移动语义是一个重要的概念,一直以来我对这个概念都似懂非懂.最近翻翻资料感觉突然开窍,因此记下.其实搞懂之后就会发现这个概念很简单,并无什么高深的地方. 先说说右值引用.右值一般指的是 ...
- 右值引用、move与move constructor
http://blog.chinaunix.net/uid-20726254-id-3486721.htm 这个绝对是新增的top特性,篇幅非常多.看着就有点费劲,总结更费劲. 原来的标准当中,参数与 ...
- C++ 11 右值引用
C++11中引入的一个非常重要的概念就是右值引用.理解右值引用是学习“移动语义”(move semantics)的基础.而要理解右值引用,就必须先区分左值与右值. 注意:左值右值翻译可能有些问题 *L ...
- C++ 11中的右值引用以及std::move
看了很多篇文章,现在终于搞懂了C++ 中的右值以及std::move 左值和右值最重要的区别就是右值其实是一个临时的变量 在C++ 11中,也为右值引用增加了新语法,即&& 比 ...
- C++11新特性:右值引用和转移构造函数
问题背景 #include <iostream> using namespace std; vector<int> doubleValues (const vector< ...
- 最近新出的C++右值引用的意思
看了一下这种方法的介绍,个人感觉,右值引用,更像人类的思想了,有些将编译前与编译后结合紧密的感觉. 左值引用是变量名的别名,右值引用是值的别名,也就是不将值赋给一个变量名所在的地址,直接将值所在的初始 ...
随机推荐
- c语言中的gets和fgets的使用差别
gets和fgets的差别 2022年6月30日 #include<stdio.h> #include<string.h> #define STLEN 8 int main(i ...
- Apache DolphinScheduler 架构演进 & Roadmap
<DataFunSummit:大数据存储架构峰会> 2021年4月17日Apache DolphinScheduler PMC chair 代立冬参与 DataFunSummit 分享&l ...
- Excel 逻辑函数(二):AND 和 OR
前言 AND 函数是且:OR 函数是或.AND 函数中的条件必须都满足才返回 TRUE:OR 函数中的条件只要满足一个就返回 TRUE.AND 和 OR 的参数最多允许有 30 个. AND [题目] ...
- 微软Azure配置中心 App Configuration (一):轻松集成到Asp.Net Core
写在前面 在日常开发中,我这边比较熟悉的配置中心有,携程Apollo,阿里Nacos(配置中心,服务治理一体) 之前文章: Asp.Net Core与携程阿波罗(Apollo)的第一次亲密接触 总体来 ...
- [CF1526D] Kill Anton(逆序对,搜索)
题面 A N T O N \rm ANTON ANTON 的基因由 A , N , T , O \rm A,N,T,O A,N,T,O 四种碱基排列组成. A N T O N \rm ANTON AN ...
- [CF1386C] Joker (IOI 赛制,分治,整体二分+可回退并查集)
题面 给一个 N N N 点 M M M 边的简单无向图,询问 Q Q Q 次,每次问你把编号在 [ l i , r i ] [l_i,r_i] [li,ri] 之间的边删掉后,该图是否存在奇数环 ...
- 【JavaWeb】学习路径1-背景
JavaWeb系列也是一个非常庞大的系列,主要分为五个部分讲解: HTML JSP和Servlet CSS的讲解 JavaScrip的讲解 jQuery框架的讲解 学习完上述内容后,就能够基本了解一个 ...
- 如何做raid级别磁盘(rhel和centos系统皆可)
添加磁盘,自己需要多少磁盘即可添加多少数量 此处只添加了三块200MB大小的磁盘 此处三块磁盘,只有两块做raid,一块与raid磁盘为实验测读写速率,不测速率可三块都做raid. 进入虚拟机给三个磁 ...
- Controller以及RestFul风格
Controller以及RestFul风格 控制器Controller 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方式实现 控制器负责解析用户的请求并将其转换为一个模型 在Spr ...
- ubuntu生成ssh_key
ssh-keygen cat ~/.ssh/id_rsa.pub