阅读至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是从变量或者表达式来推断类型的。