C++11的auto和decltype的使用

  • 一、auto类型说明符

1、auto让编译器通过初始值来推算变量的类型,所以auto定义的变量必须有初始值。

int x=0;

auto i=x;

>>auto=int;

2、使用auto可以在一条语句中声明多个变量。因为一条声明语句只能有一个基本数据类型,所以该语句中所有变量的初始值的基本数据类型都必须一样。注意:符号&和*只从属于某个声明符,而非基本数据类型的一部分(参考链接)。(这里若不好理解,可以通过给定特定值的方法假设auto为int等类型,那么int后跟多个变量时需要遵守哪些规则这里也同样需要遵守。)

auto i=0,*j=&i;

3、编译器推断出来的auto类型有时候和初始值的类型并不完全一样,主要有如下情况:

(1)当使用auto定义的变量的初始值为一个引用时,auto所指代的类型为引用的对象的类型。(使用引用其实是使用引用的对象,特别是当引用被用作初始值时,真正参与初始化的其实是引用对象的值。)

int x=0;

int &i=x;     

auto j =i;

>>auto=int;

(2)auto一般会忽略掉顶层const,同时底层const会保留下来。如果希望推断出的auto类型为一个顶层const,则需要在auto前加上const来明确指出。

const int i=0;

auto j=i;

>>auto=int;

4、可以将引用的类型设为auto,需要注意,因为不能为非常亮引用绑定字面值,而且auto会自动忽略掉顶层const,所以此时需要在auto前加const。

const auto &i=1;


  • 二、decltype类型指示符

1、decltype让编译器分析表达式并得到它的类型。

int x=0;

decltype(x) i=1;

>>decltype(x)=int;

2、与auto不同的是,decltype在处理顶层const和引用时分别会得到含顶层const的类型和引用类型,故后者必须初始化。

const int i=0,&x=i;

decltype(i) j;

decltype(x) y=1;

>>decltype(i)=const int;

>>decltype(x)=const int&

3、如果decltype使用的表达式不是一个变量,则decltype返回表达式结果对应的类型。但是有些表达式将向decltype返回一个引用类型。一般来说当这种情况发生时,意味着该表达式的结果对象能作为一条赋值语句的左值。

4、如果想得到引用对象的类型,则可以把引用作为表达式的一部分,如r+0,显然这个表达式的结果将是一个具体指而非一个引用。

5、如果表达式的内容是解引用操作,则decltype将得到引用类型。(解引用指针可以得到指针所指的对象,而且还能给这个对象赋值。因此,decltype(*p)的结果类型就是int&,而非int。)

6、decltype和auto的另一个重要区别是:

decltype(i)的结果是i的类型;

decltype((i))的结果是i的引用类型。

这是由于,如果给变量加上了一层或多层括号,编译器就会把它当成是一个表达式。变量是一种可以作为赋值语句左值的特殊表达式,所以这样的decltype就会得到引用类型。

 

 

猜你喜欢

转载自blog.csdn.net/qq_37568748/article/details/81585445