auto与decltype区别:
auto
类型说明符用编译器计算变量的初始值来推算其类型,decltype
虽然也让编译器分析表达式得到它的类型,但是并不计算表达式的值。- 编译器推算出来的
auto
类型有时候和初始值的类型并不完全一样,编译器会适当改变结果类型使其更符合初始化规则。比如,auto
一般会忽略顶层const
,而把底层const
保留下来。decltype
会把顶层const保留下来。 decltype
使用一个不加括号的变量,得到的结果就是该变量的类型,如果加上一层或多层括号,则编译器将腿短得到引用类型。
例子:
#include <iostream>
#include <typeinfo>
int main()
{
int a = 3;
auto c1 = 1; //int
decltype(a) c2 = a; //int
decltype((a)) c3 = a; // int &
const int d = 5;
auto f1 = d; //int
decltype(d) f2 = d; //const int
std::cout << typeid(c1).name() << std::endl;
std::cout << typeid(c2).name() << std::endl;
std::cout << typeid(c3).name() << std::endl;
std::cout << typeid(f1).name() << std::endl;
std::cout << typeid(f2).name() << std::endl;
c1++;
c2++;
c3++;
f1++;
//f2++; // f2是const int 类型,不能改变其值
std::cout << a << " " << c2 << " " << c2 << " " << \
c3 << " " << f1 << " " << f2 << std::endl;
return 0;
}