zoukankan      html  css  js  c++  java
  • auto用法

    在C++11中,如果编译器在定义一个变量的时候可以推断出变量的类型,不用写变量的类型,你只需写auto即可。

    第一种用法:自动推到内置类型

    int x = 100;
    //C++ 11
    auto x = 100;

    第二种用法:自动推导模版和迭代器类型

    vector<int> vec;
    auto iter = vec.iterator();

    第三种用法:用于模版

    template <typename BuiltType, typename Builder>
    void makeAndProcessObject(cosnt Builder& builder)
    {
        BuiltType val = builder.makeObject();  
        //do something 
    }

    上面的代码,我们看到这里需要两个模板参数:一个是Builder对象的类型,另一个是Builder创建出的对象的类型。糟糕的是创建出的类型无法被推导出,所以每次你必须这样调用:

    MyObjBuilder builder;
    makeAndProcessObject<MyObjBuilder>(builder);

    使用C++ 11后的修改为:

    template <typename Builder>
    void makeAndProcessObject(const Builder& builder)
    {
         auto val = bulder.makeObject();
         //...    
    }
    
    MyObjBuilder builder;
    makeAndProcessObject(builder);
    

    auto:引用、指针和常量

    下面要确定的一个问题是auto如何处理引用:

    int& foo()
    auto bar = foo(); //int& or int  

    答案是在C++11中,auto处理引用时默认是值类型,所以下面的代码bar是int。不过你可以指定&作为修饰符强制它作为引用:

    int& foo();
    auto bar = foo(); // int
    auto& baz = foo(); //int&  

    不过,假如你有一个指针auto则自动获取指针类型:

    int* foo();
    auto p_bar = foo(); // int*

    但是你也可以显式指定表明变量是一个指针:

    int* foo();
    auto *p_bar = foo(); // int*  

    当处理引用时,你一样可以标记const,如果需要的话:

    int& foo();
    const auto& baz = foo(); //const int&  

    或者指针:

    int* foo();
    const int* const_foo();
    const auto *p_bar = foo(); // const int*  
    auto p_bar = const_foo();  // const int* 
    

      

    原文博客: http://towriting.com/blog/2013/08/08/improved-type-inference-in-cpp11/

  • 相关阅读:
    关于 转换图片url为base64格式以及base64格式图片地址转为图片文件
    rem布局在Androidwebview中页面错乱
    vue中 $event 的用法--获取当前父元素,子元素,兄弟元素
    vue实现动态改变title
    vue页面跳转-携带参数
    vue项目打包部署生产环境
    Mark区
    kma 2019CSP前刷题记录
    机房的沙茶日常
    2019NOIP算法复健+学习
  • 原文地址:https://www.cnblogs.com/ThatsMyTiger/p/7084710.html
Copyright © 2011-2022 走看看