右值引用和std::move函数(c++11)

2018-09-26 来源: JoeChenzzz 发布在  https://www.cnblogs.com/Joezzz/p/9706636.html

1.对象移动

1)C++11新标准中的一个最主要的特性就是移动而非拷贝对象的能力

2)优势:

  • 在某些情况下,从旧内存拷贝到新内存是不必要的,此时对对象进行移动而非拷贝可以提升性能
  • 有些类如IO类或unique_ptr类包含不能被共享的资源,它们不能被拷贝但是可以移动

3)移动操作“窃取”资源,并不分配任何内存

2.右值引用

1)C++11引入右值引有来支持移动操作,绑定到右值的引用称为右值引用,使用&&来绑定。

 ;                 //错误,左值引用必须绑定到左值上
 ;
 int& left=n;                  //正确
 ;           //正确,左值引用的一种特殊情况,可以将const的左值引用绑定到右值上

 ;               //正确,右值引用必须绑定到右值上
 ;             //正确,右值引用绑定到临时对象上

2)左值持久,右值短暂:左值有持久的状态,而右值要么是字面常量,要么是在表达式求值过程中创建的临时变量。右值引用指向将要被销毁的对象

3.move函数

1)std::move用来获得绑定到左值的右值引用,头文件<utility>,一般不省略std::(避免名字冲突)

int&& right=std::move(n);       

2)调用move就意味着对编译器承诺:除了对源左值赋值和销毁之外,我们不对它进行其他任何操作

int main()
{
    ;
    int&& right = std::move(n);
    cout << right << endl;        //输出:5
    cout << n << endl;            //输出:5

    int num = std::move(n);    //将得到的右值引用赋给一个左值,对于内置类型,源左值依然有效
    cout << num << endl;        //输出:5
    cout << n << endl;        //输出:5

    string temp = "hehe";
    string&& rig = std::move(temp);
    cout << rig << endl;    //输出:hehe
    cout << temp << endl;    //输出:hehe

    string str = std::move(temp);    //将得到的右值引用赋给一个左值,对于类类型,源左值被清空
    cout << str << endl;    //输出:hehe
    cout << temp << endl;    //输出:空

    ;
}

运行结果:

相关文章