本文记录下一些c++11新特性需要注意的方面,供日后参考
一、auto
auto可以当成“占位符”,根据右边的类型自动推导出变量的类型。需要注意的是
- auto不能解决溢出的问题。
- auto可以与指针和引用结合使用。和指针结合使用时,auto或者auto * 都可以,和引用结合使用时必须写成auto &
- auto “带不走”cv限制符 const ,volatile属性,需要cv属性时声明const auto,volatile auto
- auto声明多个变量时,以第一个变量推导出的类型为准
unsigned int a = 2^32-1;
unsigned int b = 1;
auto c = a + b; //照样溢出,不会自动转型,c的类型还是unsigned int int a = 0;
int *pa = &a;
auto *pa1 = &a; // 等价 auto pa1 = &a;
auto &ra = a; auto x = 1, y = 2; //int x,y
const auto *m = &x, n = 1; //auto占位int,可以编译通过
auto i = 1, j = 3.14f; //auto是int,j精度损失,编译失败
以下几种情况避免使用auto
- 做函数的形参
- 结构体中,非静态成员变量不能是auto
- 声明auto数组
- 实例化模板时用auto做模板参数
二、decltype
类型推导规则decltype(e)
- 如果e是一个没有带括号的标记符表达式或者类成员访问表达式,那么decltype(e)就是e所命名的实体的类型。此外,如果e是一个被重载的函数,则会导致编译时错误
- 否则,假设e的类型是T,如果e是一个将亡值,那么decltype(e)为T&&
- 否则,假设e的类型是T,如果e是一个左值,则decltype(e)为T&
- 否则,假设e的类型是T,则decltype(e)为T