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++右值引用的意思
看了一下这种方法的介绍,个人感觉,右值引用,更像人类的思想了,有些将编译前与编译后结合紧密的感觉. 左值引用是变量名的别名,右值引用是值的别名,也就是不将值赋给一个变量名所在的地址,直接将值所在的初始 ...
随机推荐
- 如何让照片中的人物笑起来?HMS Core视频编辑服务一键微笑功能,让人物笑容更自然
最近一键"露齿笑"席卷全网,无论是短视频用户还是社交App用户都在使用这项黑科技.当三两好友聚会拍集体照留念时,为了处理个别人的表情"瑕疵",让大家都尽量保持微 ...
- linux安全之网络设置
可以通过/etc/sysctl.conf控制和配置Linux内核及网络设置. # 避免放大攻击 net.ipv4.icmp_echo_ignore_broadcasts = 1 # 开启恶意icmp错 ...
- node.js操作数据库
var sys = require('sys'); var Client = require('mysql').Client; var client = new Client(); client.us ...
- 如何仿造websocket请求?
之前两次singnalr. websocket实时推送相关: .NET WebSockets 核心原理初体验 SignalR 从开发到生产部署避坑指南 tag: 浏览器--->nginx--&g ...
- D8调试工具——jsvu的使用细则
d8 is V8's own developer shell. D8 是一个非常有用的调试工具,你可以把它看成是 debug for V8 的缩写.我们可以使用 d8 来查看 V8 在执行 JavaS ...
- HttpServletResponse 类
HttpServletResponse 类的作用 HttpServletResponse 类和 HttpServletRequest 类一样.每次请求进来,Tomcat 服务器都会创建一个 Respo ...
- redis-hash命令
一.HDEL key field [field ...] 从 key 指定的哈希集中移除指定的域.在哈希集中不存在的域将被忽略. 如果 key 指定的哈希集不存在,它将被认为是一个空的哈希集,该命令将 ...
- MQ系列4:NameServer 原理解析
MQ系列1:消息中间件执行原理 MQ系列2:消息中间件的技术选型 MQ系列3:RocketMQ 架构分析 1 关于NameServer 上一节的 MQ系列3:RocketMQ 架构分析,我们大致介绍了 ...
- Typora的破解
Typora是什么? Typora是一款支持实时预览的Markdown文本编辑器.支持即时渲染技术,这也是与其他Markdown编辑器最显著的区别.即时渲染使得你写Markdown就想是写Word文档 ...
- Windows平台RTMP/RTSP播放器实现实时音量调节
为什么要做实时音量调节 RTMP或RTSP直播播放音量调节,主要用于多实例(多窗口)播放场景下,比如同时播放4路RTMP或RTSP流,如果音频全部打开,几路audio同时打开,可能会影响用户体验,我们 ...