类型操作
别名typedef
和using
1 | typdef dobuel wages; //类型别名 |
指针,常量和类型别名
1 | typedef char *pstring; |
不能简单的把pstring
用char *
替换,如果替换了变成下式:
1 | const char *cstr = 0; //基本数据类型是const char, |
很容易把*
看成是声明符的一部分,即*cstr
的一部分,但是实际上*
是和const char
在一起的。const char *cstr
是指向char
常量的指针,而const pstring cstr
是指向char
的常量指针。
auto
关键字
编译器自动分析表达式的类型,auto
定义的变量必须有初值。
使用一条auto
语句可以声明多个变量,多个变量的基本数据类型必须一样。
1 | auto i= 0, *p = &i; //正确 |
复合类型,常量和auto
- 编译器使用
auto
推断出来的值和初始值类型有时候不完全一样。比如使用引用其实使用的是引用对象的值。 auto
会忽略顶层const
,保留底层const
。如果希望auto
推断出的是顶层const
,需要显式的加一个const
,即const auto = ...
。- 将引用的类型设为
auto
也可以保留初始值中的顶层const
属性, - 如果给初始值绑定一个引用,并且设为
auto
类型,这个对象就不是顶层const
了。1
2
3
4
5
6
7
8
9
10
11
12
13int i = 0, &r = i;
auto a = r; // a是一个int,而不是int &
const int ci = i, &cr = ci;
auto b = ci; //b是一个int
auto c = cr; //c是一个int, cr是ci别名,ci是顶层const
auto d = &i; //d是int *
auto e = &ci; //e是一个指向const的指针。
const auto f = ci; //f是const int
auto &g = ci; // g是int &
const auto &j = 43;//这个j就不是顶层const了,类型是const int &,它是底层const。
decltype
类型
decltype
和auto
的区别:
- 它只返回表达式的类型。
- 它能识别顶层
const
和引用类型1
2
3
4
5
6
7
8int i = 0, &ri = i, *pi = &i;
decltype(ri); //是int &
decltype(ri+0); //是int
const int ci = 0, &cj = ci;
decltype(ci) p = 0; //const int,
decltype(cj) q = 0; //const int &,顶层常量引用可以初始化成字面值
decltype(ci) x; //错误,常量必须初始化
decltype(cj) y; //错误,引用必须初始化
引用从来都是作为它所指对象的同义词出现,只有在decltype
处是例外。
decltype
和引用
- 如果表达式的内容是解引用操作,使用
decltype
将会得到引用类型。 decltype((variable))
的结果永远是引用,而decltype(variable)
的结果只有在真的是引用的时候才会返回引用。1
2
3int i = 0;
decltype((i)) d;
decltype(i) e;
参考文献
1.《C++ Primer第五版》