auto
C++11引入的auto关键字实现类型退到,通过这个关键字不仅能方便地获取复杂的类型,而且还能简化书写,提高编码效率。
auto x = 5; //OK
auto pi = new auto(1); //OK
const auto *v = &x, u = 6; //OK
auto int r; //error:auto不在表示存储类型指示符,这也是新更改的特性
auto str; //error:无法推导出str类型
Note:v与u的推导需要注意两个小地方
1)虽然经过前面const auto *v = &x
的推导,auto的类型可以确定为int,但是u仍然必须要写后面的“=6”,否则编译不通过。
2)U的初始化不能使编译器推导产生二义性。ep:u = 6
改为 u = 6.0, 编译器会报错。
auto并不代表实际的类型声明,仅仅是一个类型声明的“占位符”。
使用auto声明的变量必须马上初始化,让编译器推导出它的实际类型,并在编译时将auto占位符替换为真正的类型。
在C++11之前,auto 表示“具有自动存储期的局部变量”,不过其实它在这方面的作用不大,auto int i = 1;
对这个我们再熟悉不过了。不写auto也是一样的效果就是为了跟static int j = 1;区分开来而已。
auto推导可以和指针,引用结合起来使用,还可以带上const,volatile限定符。
int x = 1;
const auto e =x; //const int
auto f = e; //int
const auto& g = x; //const int&
auto& h= g; //const int&
从上面的例子不难看出:
1)当不声明为指针和引用时,auto的推导结果和初始化表达式抛弃引用和CV限定符后类型一致。
2)当声明为指针或者引用时,auto的推导结果将保持初始化表达式的cv属性。
decltype
decltype关键字,用来在编译时推导出一个表达式的类型。语法格式:
decltype(exp)
int x = 0;
decltype(x) y = 1; // y->int
const int& i = x; //i->const int &
d