1. 本节讲述顶层const和底层const的相关知识
顶层const表示指针本身是个常量
底层const表示指针所指的对象是一个常量
const int *const p //靠右的是顶层const,靠左的是底层const
const int *p //指向整型常量的指针 底层const
constexptr int *p //指向整数的常量指针 顶层const
如果确定某个对象hi常量,用constexptr 修饰,这样编译器就可以验证变量的值是否是一个常量表达式
const int sz = get_size(); //虽然此处用const修饰,这并不是一个常量表达式,因为sz的值在运行时才能够确定,此时若 用constexptr修饰,编译时编译器会给出提示
(1)auto类型说明符(用表达式的值初始化auto类型的变量)
用auto类型能够让编译器替去分析表达式所属的类型
auto item = v1+v2; //item的类型由v1加v2的类型来决定
引用作为初始化的值,以引用的对象的类型作为auto的类型
另外,auto一般会忽略顶层const,保留底层const
const int ci = i,&cr = ci;
auto b = ci; //b是一个整数(ci的顶层const被忽略掉了)
若想让b成为一个const,则需要定义为:const auto b = ci;
auto e = &ci; //e是一个指向整数常量的指针(对常量对象取地址是一种底层const)
(2)decltype类型说明(不用表达式的结果初始化decltype的变量,只用表达式结果的类型声明decltype的变量)
const int ci = 0,&cj = ci;
decltype(ci) x = 0;//x的类型是const int
decltype (cj)y = x; //y的类型是const int&
decltype(cj)z; //错误,z是一个引用,必须初始化
int i = 42,*p = &i,&r=i;
decltype(r+0) b;//正确,加法的结果是int,b是int类型
decltype (*p) c;//错误,c是int&,必须初始化。解引用得到指针所指的对象,还能给这个对象赋值,因此decltype(*p) 的结果类型就是int&
decltype((i)) d; //错误,d是int&,必须初始化,双括号的结果永远是引用