auto和decltype都是类型推断的两种方式,但之间又有区别。
主要有这几个方面的区别:
1.auto是通过编译器计算变量的初始值来推断类型的,decltype同样也是通过编译器来分析表达式进而得到它的类型,但是它不用将表达式的值计算出来。
2.编译器推断出来的auto类型有可能和初始值类型不同,比如对于顶层const,auto会忽略顶层const性质,但是decltype是保留下来的,这在下面的代码中会有所体现。
3.与auto不一样,decltype的结果类型与表达式形式有密切关系。比如decltype()内层没有括号,那么得到的类型就是变量的类型,如果有多层括号decltype(())那么返回的就是引用,具体可以通过代码分析。
#include <iostream>
#include "Sales_item.h"
int main()
{
int i = 4,&p =i;
auto a = i;//相当于int a=i;
decltype (i) b = i;//编译器推断i是一个int,相当于int b=i;
decltype ((i)) c = i;//只要出现了表达式那么decltype就推断出是引用
//相当于int &c = i;
decltype(p) q = i;//即int &q = i;
decltype(p + 0) r = i;//表达式的结果是int型 即int r =i;
std::cout << i << " " << a << " " << b <<" "<< r << std::endl;
c++;
std::cout << i << std::endl;
q++;
std::cout << i << std::endl;
const int m = 10;
auto d = m;//由于auto会失去顶层const的性质,即int d=m;
d++;//合法,d是整数
decltype (m) e = 11;//相反decltype 会保留const性质,即const int e=11;
e++;//该句非法操作 e是常量
decltype((m))f = d;//即const int &f=d;
int g = 12;
f = g;//该句非法操作,是因为f是常量引用
system("pause");
return 0;
}
执行第一段代码的打印结果:
当然对于decltype和auto还有其他值得注意的地方,平常基本上会用不到就不再总结了。