C++11特性之右值引用


title: 右值引用与移动语义
date: 2019-2-24 15:06:34
tags: 学习
categories: 平常
---ios

什么是右值?在C++中,一种被普遍承认的说法是,不能取地址,没有名字的就是右值,一般位于等号右边,相反,位于等号左边的,能取地址,有名字的被称为左值。函数

a = b + c

例如上式中,a就是个左值,b+c则是右值。性能

C++11又将右值分为纯右值和将亡值。纯右值包括:不跟对象关联的字面值,一些运算表达式(如1+3)。将亡值是跟右值引用相关的表达式,好比右值引用T&&函数的返回值,std::move的返回值。学习

右值引用就是对一个右值进行引用的类型。右值引用主要是为了移动语义,而移动语义则须要右值是能够被更改的,这也是为何不用常量引用。只有绑定右值的引用类型,就可以延长右值的生命期。spa

std::move的功能是将左值强制转换为右值引用。code

接下来看个例子:对象

#include <iostream>
using namespace std;

class HugeMem
{
  public:
    HugeMem(int size) : sz(size > 0 ? size : 1)
    {
        c = new int[sz];
    }
    ~HugeMem() { delete[] c; }
    HugeMem(HugeMem &&h) : sz(h.sz), c(h.c)
    {
        h.c = nullptr;
    }
    int sz;
    int *c;
};

class Moveable
{
  public:
    Moveable() : i(new int(3)), h(1024) {}
    ~Moveable() { delete i; }
    Moveable(Moveable &&m) : i(m.i), h(move(m.h))
    {
        m.i = nullptr;
    }
    int *i;
    HugeMem h;
};

上述代码中,强制将m.h转化为右值,从而实现移动构造。对于一些简单的,不含任何资源的的类型来讲,就无需实现移动语义了。有了移动语义,能够实现高性能的置换函数。资源

template <class T>
void swap(T &a, T &b)
{
    T tmp(move(a));
    a = move(b);
    b = move(tmp);
}
相关文章
相关标签/搜索