1.auto
类型推断
a.引入原因
编程时,经常需要将表达式的值赋给变量,这就要求我们在申明变量的时候,明确知道表达式的类型,然而要做到这一点并不容易,于是引入auto让编译器帮我们去做类型分析。
b.使用注意事项
const int const_i = 1, &const_ref = const_i;
auto
在做类型推断时,顶层const
被忽略掉,如果你希望初始值中的顶层const
保留,你需要明确指出。
auto b = const_i; // b的类型是int,const_i的顶层属性被忽略掉了。
const auto b = const_i; //b的类型是const int
auto
看待引用是把它看做原始变量的别名,是在原始变量的基础上做推断。
auto c = const_ref; //c是int, 等效auto c = const_i;
2.decltype
类型指示符
a.引入原因
有时候我们想用表达式的类型推断要定义的变量的类型,但是我们不想用表达式的类型作为变量的初始值。
decltype(f()) sum = x; //sum的类型是f()的类型,初始值是x
b.使用注意事项
- 和
auto
不同的是,decltype
处理顶层const
和引用,都是将其保留。
const int ci = 0, &cj = ci;
decltype(ci) x = 0; //x的类型为const int
decltype(cj) y = x; //y的类型为const int&
decltype(cj) z; //错误,引用必须初始化
note:引用重来都是作为其所指对象的同义词出现,只有在decltype
处是个例外。
- 如果表达式的内容是解引用操作,则
decltype
得到的是引用类型
int i = 0, *p = &i;
decltype(*p) c = i; //c的类型是int&
decltype((expresssion))
,结果永远是引用
int i = 0;
decltype((i)) d; //错误d的类型是int&, 必须初始化