阅读至2.5.2时,发现一个不知道的知识点:
如果某个类型的别名指代的是复合类型或是常量,那么它用到声明语句里面就会产生意想不到的后果,例如下面的声明语句用到了类型pstring,它实际上是类型char*的别名:
typedef char* pstring; 1
const pstring cstr = 0; //cstr是指向char的常量指针
const pstring* ps; //ps是一个指针,指向char的常量指针。
与
const char * cstr = 0; 2
区别:
2是说定义了一个指针cstr,而该指针指向的char对象是const类型,即指向常量的指针。
1是说定义了一个指针cstr,该指针指向pstring类型,因为const与类型结合是:const与类型的顺序没有规定,可对比 const int i; (i是个常量),所以const修饰的是cstr,又因为pstring是个指针类型,所有cstr是pstring类型(指向char)的常量指针,
关于auto
auto一般会忽略顶层const,而用const修饰的auto后,该对象的初始值便是const如2;
int
i = 0, &r = i;
auto
a = r;
//a 是int类型
1
const
int
ci = i, &cr = ci;
auto
b = ci;
// b is an int (top-level const in ci is dropped)
auto
c = cr;
// c is an int
auto
d = &i;
// d is an int*
auto
e = &ci;
// e is an int*
2
const
auto
f = ci;
// f is a const int
auto
& g = ci;
// ci is const int
typeid:返回当前变量所属类型的名。
decltype((variable))注意是双层括号,这样的结果永远是引用,而得出了decltype(variable)当里面的值是引用是,结果才是引用。
auto是通过初始值来推断变量类型的,而decltype是从变量或者表达式来推断类型的。