定义类型别名的两个方式
// integer 是 int 的同义词,intp 是int* 的同义词
//using integer = int;
//using intp = int*;
typedef int integer, * intp;
integer i = 1;
intp p = &i;
cout << "value of i: " << i << endl;
cout << "value of p: " << p << endl;
cout << "value of *p: " << *p << endl;
/*
value of i: 1
value of p: 00FFFA7C
value of *p: 1
*/
如果类型别名指代的是复合类型,不能将类型别名替换成本来的名字去理解,比如指针的类型别名:
using charp = char*;
const char a = 'a';
const charp p = &a; // 不可以,这里的const是对char*的修饰,p是一个常量指针
const char* p1 = &a; // 可以,p1是一个指向字符常量的指针
auto类型说明符
- auto能让编译器替我们去分析表达式所属的类型。
- auto让编译器通过初始值来推算变量的类型,auto定义的变量必须有初始值。
- auto能在一条语句中声明多个变量,该语句中所有变量的初始基本数据类型必须都一样。
int i = 0;
const int j = 1;
auto& ir = i, & jr = j; // 不可以,j是整型常量
- auto会忽略顶层const,保留底层const
const int i = 0;
const int& ir = i;
auto j = i; // j是一个整型常量
auto& jr = ir;
jr = i; // 不可以,ir的底层const被保留了下来,jr是一个对整型常量的引用
decltype类型指示符
decltype选择并返回操作数的数据类型,在此过程中,编译期分析表达式并得到它的类型,却不实际计算表达式的值。
如果decltype使用的表达式是一个变量,则返回变量的类型(包括顶层const以及引用
如果表达式内容是解引操作,则decltype将得到解引类型。
int i = 0;
int j = 1;
int* ip = &i;
// ip 是指向j的指针
decltype(ip) ip1 = &j;
// ir 是j的引用
decltype(*ip) ir = j;
ir++;
cout << "value of j: " << j << endl;
cout << "value of ir: " << ir << endl;