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/

  • 相关阅读:
    制作A4纸打印的网页像素大小设置(转)
    关于Vue.use()详解
    Vue的axios如何全局注册
    JS中的apply,call,bind深入理解
    JS异步编程 (2)
    JS异步编程 (1)
    彻底搞清楚javascript中的require、import和export(js模块加载规范的前世今生)
    IPv6地址分类及表示方法
    SublimeText3追踪函数工具CTags设置及使用
    转-编写CGI小结
  • 原文地址:https://www.cnblogs.com/ThatsMyTiger/p/7084710.html
Copyright © 2011-2022 走看看