C++11常用特性介绍——左值引用、右值引用
一、左值、右值
1)左值:可以放在赋值号左侧、可以被赋值的值;左值必须要在内存中有实体。
2)右值:必须放在赋值号右侧、取出值赋值给其它变量;右值可以在内存中也可以在CPU寄存器中。
二、引用
引用是C++语法做优化,引用的本质还是靠指针来实现的,引用相当于变量的别名。
声明引用的时候必须初始化,且一旦绑定,不能对引用重定义,对引用的一切操作,相当于对原对象的操作。
三、左值引用
C++11之前,没有左值引用和右值引用之分,引用专指左值引用
左值引用的基本语法:type & 引用名 = 左值表达式,如:
int a = 1;
int &b = a;//a必须是左值,不能为右值
int &c = 1;//错误,1为右值
C++11前为了使引用接受左值又能接受右值,对const &添加了特殊技能,如:
cont int& c = 1;//正确
但是这种解决方式只能解决参数不变的情况,如果参数可变问题依然存在,为了解决这种问题,C++11引入了右值引用
四、右值引用
右值引用的基本语法:type && 引用名 = 右值表达式,如:
int && a = 1;//1为右值(&&中间不可以有空格)
五、万能引用
如果一个地方即有左值引用,又有右值引用,而且功能函数内容相同,这样就要写两遍代码,问题变得更麻烦了,如:
#include <iostream>
void Func(const i &){
std::cout << i << std::endl;
}
void Func(int i&){
std::cout << i << std::endl;
}
void Func(int &&i){
std::cout << i << std::endl;
}
int main()
{
int a = 1;
const int b = a;
Func(b);//调用Func(const int &i);
Func(a);//调用Func(int &i);
Func(1);//调用Func(int && i);
}
为了解决这个问题,在模板函数上添加了一个完美转发语法,这样上面的几个函数可以合成一个函数, 如:
template <typename T>
void Func(T && t)
{
std::cout << t << std::endl;
}
注:这里的&&已经不是右值引用了,而是被称为万能引用(universal references),而这种用法称为完美转发。
C++11常用特性介绍——左值引用、右值引用的更多相关文章
- C++11常用特性介绍——auto类型修饰符
1.C++11常用特性介绍 从本篇开始介绍C++11常用特性,大致分:关键字及新语法.STL容器.多线程.智能指针内存管理,最后讲一下std::bind和std::function 二.关键字和新语法 ...
- C++11新特性,对象移动,右值引用,移动构造函数
C++11新标准中的一个最主要的特性就是移动而非拷贝对象的能力.接下来简要介绍一下相关概念. 右值引用 所谓右值引用就是必须绑定到右值的引用.通过 && 而不是 & 来获得右值 ...
- C++11常用特性介绍——Lambda表达式
一.C++11采用配对的方括号[]来创建一个匿名函数并执行,如: #include <iostream> int main() { auto func = []{ std::cout &l ...
- C++11常用特性介绍——decltype关键字
一.decltype的意义 有时我们只想从表达式的类型推断出要定义的变量类型,但是不想用其值进行初始化的时候,C++11新标准引入了decltype类型说明符,它的作用是选择并返回操作数的数据类型,在 ...
- C++11常用特性介绍——array容器
std::array是具有固定大小的数组,支持快速随机访问,不能添加或删除元素,定义于头文件<array>中. 一.概要 array是C++11新引入的容器类型,与内置数组相比,array ...
- C++11常用特性介绍——列表初始化
一.列表初始化 1)C++11以前,定义初始化的几种不同形式,如下: int data = 0; //赋值初始化 int data = {0}; //花括号初始化 int data(0); / ...
- C++11常用特性介绍——constexpr变量
一.constexpr变量 1)将变量声明为constexpr类型以便由编译器来验证变量的值是否为一个常量表达式,声明为constexpr的变量一定是一个常量,而且必须用常量表达式来初始化,如: in ...
- C++11常用特性介绍——for循环新用法
一.for循环新用法——基于范围的for循环 for(元素类型 元素对象 : 容器对象) { //遍历 } 1)遍历字符串 std::string str = "hello world&qu ...
- C++11常用特性介绍——nullptr关键字及用法
一.nullptr关键字及用法 1)NULL的二义性 void func(int) {} void func(int*) {} 当函数调用func(NULL)时会执行哪个函数呢? 先看C++对NULL ...
随机推荐
- js面向过程 分页功能
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 利用ansible-playbook一键部署ELK(ElasticSearch,logstash and kibana)
一.部署前环境介绍: es集群5台(es01,es02,es03,es04,es05),logstash服务器1台(logstash2),kibana服务器1台(kibana2),模拟apache服务 ...
- splay2(区间修改+内存回收)
poj3580 要求写一种数据结构: 对一个序列进行 区间增减(add): 区间翻转(reverse): 区间移动(revolve): 插入(insert): 删除(delete): ...
- 二次封装 Reponse,视图家族
复习 """ 1.整体修改与局部修改 # 序列化 ser_obj = ModelSerializer(model_obj) # 反序列化,save() => cre ...
- 左偏树 (bzoj 2809)
Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都有且仅有一个上级. ...
- caffe_ocr开源项目学习笔记
本机配置cuda8.0使用的cudnn是下面要说的重点,vs2015,win10,1080Ti 下载了开源项目:https://github.com/senlinuc/caffe_ocr 编译的时候报 ...
- vnpy源码阅读学习(5):关于MainEngine的代码阅读
关于MainEngine的代码阅读 在入口文件中,我们看到了除了窗体界面的产生,还有关于MainEngine和EventEngin部分.今天来学习下MainEngine的代码. 首先在run代码中,我 ...
- 松软科技web教程:JavaScript HTML DOM 元素
查找 HTML 元素 通常,通过 JavaScript,您需要操作 HTML 元素. 为了达成此目的,您需要首先找到这些元素.有好几种完成此任务的方法: 通过 id 查找 HTML 元素 通过标签名查 ...
- opencv python:Canny边缘提取
Canny是边缘提取算法,在1986年提出的 是一个很好的边缘检测器 Canny算法介绍 非最大信号抑制: 高低阈值连接: example import cv2 as cv import numpy ...
- 吴裕雄 PYTHON 神经网络——TENSORFLOW 单隐藏层自编码器设计处理MNIST手写数字数据集并使用TensorBord描绘神经网络数据
import os import numpy as np import tensorflow as tf import matplotlib.pyplot as plt from tensorflow ...