摘要

移动语义是C++11的新特性之一,利用移动语义可以实现对象的移动而非拷贝。在某些情况下,可以大幅度的提升性能。本文将介绍C++11移动语义中的一些基本概念。

表达式

表达式是由一个或者多个运算对象组成,对表达式求值将得到一个结果,字面值和变量是最简单的表达式,其结果就是字面值和变量的值。把一个运算符和一个或者多个运算对象组合起来可以生成较为复杂的表达式。

左值和右值

左值:能够取得地址的表达式是左值。例如:常见的变量都是左值。又例如一般情况下的赋值表达式是左值(所以一般要求类中重载的赋值操作符要返回*this)。

右值:不能取地址的表达式是右值。例如函数的非引用返回值或者字面常量。(可以简单的理解,右值是没有名字,但是又确实被创建的临时变量)。

class A
{
}; //a为左值
A a; //getA函数返回右值
A getA()
{
return A();
} void setA(A a)
{ }
//实参A()为右值
setA(A())

右值引用

引用:变量的别名。有以下要点:1)对引用的操作与对变量的操作是完全一样的;2)定义引用的时候必须进行初始化,而且不能绑定到其他对象上去。

左值引用:常规引用,只能绑定到左值上(有的编译器可以绑定到右值,见下文例子)。

右值引用:必须绑定到右值的引用。由于右值通常是被临时创建、即将被销毁的对象,所以右值引用可以延长右值的生命周期,直到右值引用类型的变量超出作用域,右值引用类型的变量在销毁的同时,被引用的右值也一并销毁。

这里请注意:变量的类型和变量本身是左值还是右值没有关系(只要是变量,就都是左值,因为其有名字,可以取地址。)例如:不能将右值引用绑定到右值引用类型的变量,这很奇怪,但是实际确实如此:

//a为右值引用类型的变量
A&& a = getA(); //错误,a为左值,不能将左值绑定到右值引用上
A&& b = a;

上文提到有的编译器可以将右值绑定到左值引用上面,在vs2015中,

//vs2015中没有报错,将右值绑定到左值引用上面
A& a = getA();

在g++5.3.1,上述代码会报错,不能将右值绑定到左值引用上面。

可见,对于右值绑定到左值引用上面,不同的编译器的要求是不一样的,可以不必过分关注这些细节问题。右值最重要的使用场景是对象的移动,接下来的文章会进行介绍。

参考

C++ Primer(第5版)

C++11移动语义之一(基本概念)的更多相关文章

  1. c++ 11 移动语义、std::move 左值、右值、将亡值、纯右值、右值引用

    为什么要用移动语义 先看看下面的代码 // rvalue_reference.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #includ ...

  2. c++ 11 移动语义

    C++ 已经拥有了拷贝构造函数, 和赋值函数,它们主要定位为浅和深度拷贝, 新增加一个移动构造函数,主要避免拷贝构造. 在定义了移动构造函数的情况下,在实参(argument)是一个右值(rvalue ...

  3. c++11 移动语义move semantics

    performance, expensive object copies move semantics, temporary objects implemented with rvalue refer ...

  4. [18/11/7] Java的基础概念

    java语言的优势是跨平台 ,计算机界的英语,是IT行业的第一大语言 特点是多线程 分布式 健壮性 面向对象 java和JavaScript的关系 雷锋和雷峰塔的关系 或卡巴斯基和巴基斯坦的关系有个基 ...

  5. 对C++11中的`移动语义`与`右值引用`的介绍与讨论

    本文主要介绍了C++11中的移动语义与右值引用, 并且对其中的一些坑做了深入的讨论. 在正式介绍这部分内容之前, 我们先介绍一下rule of three/five原则, 与copy-and-swap ...

  6. Jena语义Web开发101

    2015/05/28更新 代码在 https://github.com/zhoujiagen/semanticWebTutorialUsingJena 前言 该手册参考和扩展“Hebeler J, F ...

  7. [转载] C++11新特性

    C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而中文版维基百 ...

  8. C++ 11 学习2:空指针(nullptr) 和 基于范围的for循环(Range-based for loops)

    3.空指针(nullptr) 早在 1972 年,C语言诞生的初期,常数0带有常数及空指针的双重身分. C 使用 preprocessor macroNULL 表示空指针, 让 NULL 及 0 分别 ...

  9. C++ 11 左值,右值,左值引用,右值引用,std::move, std::foward

    这篇文章要介绍的内容和标题一致,关于C++ 11中的这几个特性网上介绍的文章很多,看了一些之后想把几个比较关键的点总结记录一下,文章比较长.给出了很多代码示例,都是编译运行测试过的,希望能用这些帮助理 ...

随机推荐

  1. Solution -「ARC 104E」Random LIS

    \(\mathcal{Description}\)   Link.   给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...

  2. R数据分析:数据清洗的思路和核心函数介绍

    好多同学把统计和数据清洗搞混,直接把原始数据发给我,做个统计吧,这个时候其实很大的工作量是在数据清洗和处理上,如果数据很杂乱,清洗起来是很费工夫的,反而清洗好的数据做统计分析常常就是一行代码的事情. ...

  3. ESXI 7.0.0 U2 部署

    文章目录 什么是ESXI? ESXi 的优势 功能特性 部署ESXI 创建虚拟机 开始安装 打开浏览器输入ip进行管理 什么是ESXI? ESXI官网:https://www.vmware.com/c ...

  4. PRML 概率分布

    本文地址:https://www.cnblogs.com/faranten/p/15917369.html 转载请注明作者与出处 1 二元变量 1.1 伯努利分布与二项分布 ​ 考虑一个最基本的试验: ...

  5. Vue.js——学习笔记

    Vue-自学笔记 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅 ...

  6. Spring MVC 是什么? 核心总结

    SpringMVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰 ...

  7. [LeetCode]1365. 有多少小于当前数字的数字

    给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目. 换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != i 且 ...

  8. Nginx 配置apple-app-site-association

    ios突然给我发了如上链接和一个json,说他那边需要放一个 apple-app-site-association 文件用来支持他那边的功能,文件不需要后缀. 先说一下要求:线上官网的地址后面跟上他所 ...

  9. [题解]Mail.Ru Cup 2018 Round 1 - D. Changing Array

    [题目] D. Changing Array [描述] 给n个整数a[1],...,a[n],满足0<=a[i]<=2^k-1.Vanya可以对这n个数中任一多个数进行操作,即将x变为x' ...

  10. linux安装ngixn

    卸载ngxin(第一次安装请略过) 1.检查nginx是否启动,是否安装ngxin 检查是否安装nginx命令 rpm -qa|grep nginx 检查nginx是否启动命令: pa -ef|gre ...