1. 类型别名
1.1 使用方式
typedef double dou;
using pf = int(*)();
1.2 类型别名与常量、指针
使用类型别名时,常常认为是做简单的替换,在类型别名指代复合类型或常量时则可能产生认知错误;
例程中,pint
指代int *
,声明变量时如果简单替换,则得到 const pint cint1
->const int* cint1
,则cint1和cint2类型应当一致,但程序中注释语句会产生错误,指明这两个变量并不是相同类型,实际上,cint1是顶层const指针,而cint2是底层const指针;
const是对给定类型的修饰,因此const修饰pint时,修饰的是指针类型,cint1是指向int的常量指针;而替换后修饰的是int,cint2是指向const int的指针。
int main() {
using pint = int*;
int ii = 0;
const pint cint1 = ⅈ
const int* cint2 = ⅈ
*cint1 = 2;
//*cint2 = 2; //报错
int ii1 = 2;
//cint1 = &ii1; //报错
cint2 = &ii1;
return 0;
}
2. auto
2.1 使用方式
auto根据初始值推断类型,因此不给初始值会报错;
auto不会推断引用类型,推断引用需要带上引用符号
int ii = 0;
//auto ii2;
auto& ref1 = ii; //int&
auto ref2 = ref1; //int
int* pii = ⅈ
auto refp = pii; //int*
auto&& ref3 = ii; //int&
auto&& ref4 = 10; //int&&
auto&& ref5 = ref3; //int&
auto&& ref6 = ref4; //int&
2.2 auto与常量
auto会保留底层const,忽略顶层const;
使用auto&时,顶层const则会保留
const int ii = 10;
auto ii1 = ii; //int
auto& ref1 = ii; //const int&
const int* const cptr = ⅈ
auto cptr1 = cptr; //const int*
auto& refp = cptr; //const int *const
int ii2;
cptr1 = &ii2;
//refp = &ii2; //报错
3. decltype
3.1 使用方式
decltype可以推断操作数的类型;
decltype可以推断顶层const;
不同于auto,decltype可以直接推断引用,此时引用对象不再作为原对象的同义词;
ref+1是具体值,因此推断出int;
*p可以赋值,因此推断出int&;
变量加括号,推断出int&;
int ii = 10;
const int cii = 15;
int& ref = ii;
int* p = ⅈ
decltype(ii) ii1; //int
decltype(cii) ii2 = 0; //const int
decltype(ref) ref1 = ii; //int&
decltype(ref + 1) ii3; //int
decltype(p) ptr; //int*
decltype(*p) ref2 = ii; //int&
decltype((ii)) ref3 = ii; //int&