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/

原文地址:https://www.cnblogs.com/ThatsMyTiger/p/7084710.html