c++11新特性注意点

时间:2022-11-02 15:06:49

本文记录下一些c++11新特性需要注意的方面,供日后参考

一、auto

auto可以当成“占位符”,根据右边的类型自动推导出变量的类型。需要注意的是

  1. auto不能解决溢出的问题。
  2. auto可以与指针和引用结合使用。和指针结合使用时,auto或者auto * 都可以,和引用结合使用时必须写成auto &
  3. auto “带不走”cv限制符 const ,volatile属性,需要cv属性时声明const auto,volatile auto
  4. 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

  1. 做函数的形参
  2. 结构体中,非静态成员变量不能是auto
  3. 声明auto数组
  4. 实例化模板时用auto做模板参数

二、decltype

类型推导规则decltype(e)

  1. 如果e是一个没有带括号的标记符表达式或者类成员访问表达式,那么decltype(e)就是e所命名的实体的类型。此外,如果e是一个被重载的函数,则会导致编译时错误
  2. 否则,假设e的类型是T,如果e是一个将亡值,那么decltype(e)为T&&
  3. 否则,假设e的类型是T,如果e是一个左值,则decltype(e)为T&
  4. 否则,假设e的类型是T,则decltype(e)为T