C++之auto类型关键字的使用

1.何时使用?

如果我们想定义一个和某个表达式类型一致的变量:
比如,表示式为字面值3.14(编译器默认浮点型字面值为double类型),则可以这么定义

  double i=3.14;

试想等号右边类型我们能否一直获取的到呢?或者十分清楚呢?答案自然是否定的。
比如,我们定义一个string类的对象

string a="sss";
cout<<a.size();

请问a.size()是什么类型?int ?unsigned?都不是,其实string类对象的成员函数size(),它的返回值的类型是string::size_type。
由于某些表达式的类型我们搞不清,或者压根无法获取,但是我们却又需要使用该类型时,这时可以请出我们的救星:auto类型关键字和decltype类型指示符

auto i=a.size();//声明时,必须初始化。
decltype(a.size) j;//可以只声明,不初始化。

2.auto类型关键字的使用

1. auto类型关键字的作用
c++11新标准引入了auto类型关键字,用它就能让编译器替我们去分析表达式所属的类型。比如:

  auto item=val1+val2/*编译器根据val1和val2相加的结果推断出item的类型
并且以它们相加的值对item进行初始化*/
    

注意!注意!注意!
一条声明语句中的变量类型一定是相同的,在一条声明语句中进行多变量的声明时,一定确保初始的基本数据类型一致(注意 “&”和“*” 不是类型,只是类型的修饰符)切忌犯以下的错误

auto size=0,pi=3.14;//错误大大的!!!

由于声明语句只含有一个变量类型auto,它同时作用size和pi,在前半部分编译器会根据0,推断出auto是int,后半部分编译器会根据3.14推断出auto是double,前后矛盾,所以错误。

2. auto和初始值类型不一样的情况
当auto遇到初始值类型为复合类型(指针和引用)、常量时,编译器推测的结果和初始值类型并不会完全一致。
(1)当初始值为引用类型时
例1:

int i=0,&r=i;
auto j=r;//此时j为整型

为什么会是整形呢?因为对引用进行的操作相当于对引用所绑定的对象进行操作,即用r初始化j就相当于用i初始化j所以得到的是整形。

(2) auto会忽略掉顶层const,底层const保留
例2:

const int ci=i,&cr=ci;
auto a=ci;//a是整型,顶层const被忽略掉
auto b=cr;//b是整形,使用cr相当于使用ci,此时会忽略掉顶层const
auto c=&i;//c为一个指向整形变量的指针
auto d=&ci;//d为一个指向整形常量的指针,对常量对象取地址,是一种底层cosnt

(3) 设置一个auto类型的引用时,初始值中的顶层常量const会保留。
例3:

auto &e=ci;//e是对常量对象的引用

(4) 以下也是需要注意的地方

auto &f=1;//错误,如果不是对常量的引用不能绑定字面值
const &g=42;//此时正确

关于decltype指示关键字以后再更,如有错误请批评指正。

你可能感兴趣的:(c++)