c++11
- using -- 2.5.1
- auto -- 2.5.2
- decltype -- 2.5.3
2.5 处理类型
2.5.1 类型别名
typedef double aliasOfDouble, *aliasOfDoublePtr, &aliasOfDoubleRef;
using aliasOfDouble =double;
using aliasOfDoublePtr =double*;
using aliasOfDoubleRef =double&;
- 类型别名与类型等价
- 复合类型的类型别名是一个整体,不可拆分来理解
typedef double *aliasOfDoublePtr;
const aliasOfDoublePtr p;
const double *p;//非等价形式,直接拆分是错误的,并非指向常量的指针。
double *const p;//等价的形式,const是用于修饰double*双精度浮点数指针的,因此是常量指针。
2.5.2 auto类型说明符
- 用于在声明时由编译器根据右值的数据类型推算数据类型
auto i = 0;//int
- 一条语句可以声明多个变量,但是基本数据类型必须相同
auto i=0, *p=&i; //正确,都是整形
auto x=0, y=1.1; //错误,基本类型不同
- 引用作为右值实则是其引用的对象,所以auto是其引用对象的数据类型,而非引用类型
- 上面说到auto不会是引用类型,那么自动类型的引用通过
auto &实现
int y = 10;
auto & x = y;
- 同为复合数据类型的指针,既可以使用
auto,也可以使用auto *。
- auto忽略右值的顶层const,不会忽略底层const。
- 如果希望包含顶层const,则需要明确指出
const auto x = 10;
2.5.3 decltype类型指示符
- decltype()使得编译器不必进行表达式或者函数计算,而是取其返回值的数据类型作为自动类型,这样一来变量可以初始化为其他值;
decltype(f()) sum = x;
- decltype的自动类型包含引用和顶层const,不同于auto
- 因为decltype可以生成引用类型,如果要使得其生成引用所指的类型,可以将其作为表达式的一部分
int i=10, &r=i;
decltype(r+0) b;
int i=10, *p=&i;
decltype(*p) b;//错误,b是一个int&,需要初始化
- 变量加括号
(x)是一个表达式,返回值是可以作为左值的x的引用
decltype((i)) d;//错误,d是一个整形引用,需要初始化