zoukankan      html  css  js  c++  java
  • c++11——move/forward

    std::move

        c++11中提供了std::move()来将左值转换为右值,从而方便的使用移动语义。move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存拷贝。 
        c++中所有容器都实现了move语义,方便我们实现性能优化。move只是转移了资源的控制权,本质上是将左值强制转换为右值引用,以用于move语义,避免含有资源的对象发生无谓的拷贝。move对于拥有形如对内存、文件句柄等资源的成员的对象有效。如果是一些基本类型,比如int或char[10]数组等,如果使用move,仍然会发生拷贝(因为没有对应的移动构造函数),所以move对于含资源的对象来说更有意义。

        std::list<std::string> tokens;
        std::list<std::string> t = std::move(tokens); //发生了移动构造。list在实现的时候,是将目的对象的资源句柄赋值为源对象的资源句柄,而将源对象的资源句柄清空。
    
    std::forward

        右值引用类型是独立于值的,一个右值引用参数作为函数的形参,在函数内部再转发该参数的时候它已经变成一个左值,并不是他原来的类型。

    如果我们需要一种方法能够按照参数原来的类型转发到另一个函数,这种转发类型称为完美转发

    template<typename T>
    void print(T& t){
        cout << "lvalue" << endl;
    }
    template<typename T>
    void print(T&& t){
        cout << "rvalue" << endl;
    }
    
    template<typename T>
    void TestForward(T && v){
        print(v);
        print(std::forward<T>(v));
        print(std::move(v));
    }
    
    int main(){
        TestForward(1);
        int x = 1;
        TestForward(x);
        TestForward(std::forward<int>(x));
        return 0;
    }
    

  • 相关阅读:
    Maven下Flex国际化配置
    Adobe AIR and Flex
    jQuery: 刨根问底 attr and prop两个函数的区别
    HTML5[8]: 图文混排,图片与文字居中对齐
    HTML5[7]: 实现网页版的加载更多
    HTML5[6]:多行文本显示省略号
    HTML5[5]:在移动端禁用长按选中文本功能
    HTML5[4]:去除不必要的标签,完全使用css实现样式
    HTML5[3]:中文换行
    HTML5[2]:使用viewport控制手机浏览器布局
  • 原文地址:https://www.cnblogs.com/gtarcoder/p/4805692.html
Copyright © 2011-2022 走看看