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++右值引用的意思
看了一下这种方法的介绍,个人感觉,右值引用,更像人类的思想了,有些将编译前与编译后结合紧密的感觉. 左值引用是变量名的别名,右值引用是值的别名,也就是不将值赋给一个变量名所在的地址,直接将值所在的初始 ...
随机推荐
- Javaweb-JSP详解
一.什么是JSP Java Server Pages:Java服务器端页面,和Servlet一样,用于动态web技术 最大的特点: 写JSP就像在写HTML 区别: HTML只给用户提供静态的数据 J ...
- Java学习(二)Dos
打开CMD方式 开始+系统+命令提示符 WIN键+R 输入cmd 在任意的文件夹下面,按住SHIFT键+鼠标右键,在此处打开命令行窗口 在资源管理器的地址栏前面加上cmd 路径 常用Dos命令 #盘符 ...
- cmake错误的解决
安装Mysql时出现:CMake Error: Error executing cmake:: LoadCache(). Aborting. 对比:/usr/bin/cmake 和 /usr/loca ...
- 熔断器-Hystrix。。。之降级方法
与Feign的Fallback降级方法不同,这个hystrix降级方法是写在被调用方的 需要依赖: <dependency> <groupId>org.springframew ...
- DES|3DES|AES|RSA|DH | CA | SSL(HTTPS)
1.对称密钥算法: 加解密速度块,算法使安全的,已知算法无法推出密钥.但是密钥的分发困难. DES:对称密钥算法,是一种块加密算法,只有一个密钥.加解密都是用一个密钥. 3DES:与DES一样,可以认 ...
- String与StringBuilder相互转换以及获取字符串中第一个中文汉字
String与StringBuilder相互转换 1. StringBuilder转为String StringBuilder sb = new StringBuilder(); sb.append( ...
- 第四篇:理解vue代码
解释以下代码: 实现输入框中能够打字的功能 <el-input v-model="input" placeholder="在这打字"></el ...
- ubuntu语言支持打不开,点了没反应
ubuntu语言支持打不开,点了没反应 sudo dpkg-reconfigure locales
- Spark 读取HDFS csv文件并写入hive
package com.grady import org.apache.spark.SparkConf import org.apache.spark.sql.{Row, SaveMode, Spar ...
- STL再回顾(非常见知识点)
目录 为人熟知的pair类型 再谈STL 迭代器的使用 常用的STL容器 顺序容器 vector(向量) 构造方式 拥有的常用的成员函数(java人称方法) string 构造方式 成员函数 dequ ...