在C++11中,auto关键字被作为类型自动类型推导关键字
(1)基本用法
C++98:类型 变量名 = 初值; int i = 10;
C++11:auto 变量名 = 初值; auto i = 3.14;
借助于auto关键字,可对变量进行隐式的类型定义,即由编译器在编译期间根据变量的初始化语句,自动推断出该变量的类型.
auto a = 1;//a被推导为int auto b = new auto(2);//b推导为int* auto const *c = &a;//
在旧语法中,auto型变量存储于栈区,static型变量存储于静态区,二者不能同时使用,但c++11的auto关键字已经不再作为存储类型指示符
static auto i = 4; auto int j; //error
auto并不能代表一个世纪的类型声明,只是一个类型声明的占位符,使用auto声明的变量必须马上初始化,以让编译器推断出它的实际类型并在编译剪短将auto替换为真的类型
auto k; //error
(2)auto同指针或引用结合使用
即使不把auto声明为指针,其亦可被推导为指针类型
int a = 0; auto *b = &a; //auto=int b==>int* auto c = &a //auto=int* c==>int*
当表达式带有引用属性时,auto会抛弃其引用属性
auto &d = a; //auto=int d==>int& auto e = a; //auto=int e==>int
当表达式带有CV限定,auto会抛弃其CV限定
auto const f = a; //auto=int f==>int const auto g = f; //auto=int g==>int
但是如果auto和引用或指针结合使用,表达式的CV限定会被保留下来
auto const &h = a; //auto=int h==>int const& auto &i = h; //auto=int const i==>cosnt & auto *j = &h; //auto=int const j==>int const*
(3)auto使用的限制
auto不能用于函数的参数
void foo(auto i){...}//error 无法推导为int
foo(10);
auto不能用于类的非静态成员变量
auto不能用于模板的类型实参(模板的类型实参都是)
Dummy<int> d1; Dummy<auto> d2 = d1; //error
auto不能用于数组元素
int a[10];auto b[10] = a;//errorauto c = a; //ok,但是c推断为int*auto &d = a; //ok,但是此时a代表的是数组整体不是首地址
(4)何时使用auto
通过auto减少模板的类型参数
通过auto可以简化某些复杂类型的书写
#include <iostream>
#include <typeinfo>
#include <map>
#include <string>
using namespace std;
class A{
public:
A(int arg = 0):m_var(arg){}
int get(void)const{return m_var;}
void set(int arg){m_var = arg;}
private:
int m_var;
};
class B{
public:
B(char const *arg = ""):m_var(arg){}
char const *get(void)const{return m_var;}
void set(char const *arg){m_var = arg;}
private:
char const *m_var;
};
//C++98版本
template<typename V,typename X>
void foo(X const &x){
V var = x.get();
cout << var << endl;
}
//C++11版本
template<typename X>
void bar(X const &x){
auto var = x.get();
cout << var << endl;
}
int main(void) {
A a(1234);
B b("abcd");
foo<int>(a); //X会隐式推断
foo<char const*>(b);
multimap<string,int> mm;
mm.insert(make_pair("zhangfei",70));
mm.insert(make_pair("zhaoyun",75));
mm.insert(make_pair("guanyu",90));
mm.insert(make_pair("zhangfei",50));
mm.insert(make_pair("zhaoyun",80));
mm.insert(make_pair("guanyu",80));
//C++98版本
pair<multimap<string,int>::iterator,multimap<string,int>::iterator> its1 = mm.equal_range("zhangfei");
int sum1 = 0;
for (multimap<string,int>::iterator it=its1.first; it != its1.second; it++)
sum1 += it->second;
cout << sum1 << endl;
//c++11 auto版本
auto its2 = mm.equal_range("zhangfei");
int sum2 = 0;
for(auto it = its2.first; it != its2.second; it++)
sum2 += it->second;
cout << sum2 << endl;
return 0;
}
来源:https://www.cnblogs.com/niie9/p/6156365.html