C++ constexpr auto 类型别名
常量表达式(const expression)是指值不会改变且在编译过程就能得到结果的表达式。用常量表达式初始化的const对象也是常量表达式。

尽管sz是一个常量,但是他的值在具体运行时才能得到,所以不是常量表达式。
constexpr变量
在一个复杂系统中我们基本很难确定一个初始值到底是不是常量表达式,c++11新标准规定(指的c++ primer第五版的标准)允许将变量声明为constexpr类型以便由编译器来验证变量是否是一个常数表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。

尽管不能使用普通函数作为constexpr变量的初始值,但是后面我们将介绍一种新标准允许定义一种特殊的constexpr函数。
字面值类型
常量值表达式的值需要在编译时就得到计算,因此对声明constexpr就有所限制,我们将他称为“字面值类型”
到目前为止算术类型、引用和指针都属于字面值类型。自定义的类不属于字面值类型,也就不能被定义为constexpr,在比较后面我们还会介绍一些字面值类型。
尽管指针和引用都能定义为constexpr,但是他们的初始值都受到严格的限制,一个constexpr指针的初始值必须是nullptr或者0,或者是储存某个固定地址中的对象。
后面我们会提到,函数体内定义变量一般来说并非存放在固定地址中,因此constexpr指针不能指向这样的变量,相反函数体之外的对象地址固定不变,因此可以用来初始化constexpr指针。往后我们还将详细讲述允许函数定义一类有效范围超出函数本身的变量,这类变量、也有固定地址。
指针和constexpr
如果constexpr定义了一个指针,那么constexpr只对指针有效。

这里q和p相差甚远,关键字constexpr把他所定义的对象置为了顶层const。
与其他常量指针类似,constexpr指针既可以指向常量也可以指向非常量。

类型别名
类型别名可以让复杂的名称变得简单。有两种定义类型别名的方法。
1关键字typedef

2新标准定了一种新方法,使用别名声明来定义。

using关键字将左侧的名字规定成右侧类型的别名。
指针、常量和类型别名
如果某个类型别名指代的是复合类型或常量,那么将他用到声明语句就会产生意想不到的后果。

const是对给定类型的修饰,pstring实际上是指向char的指针,因此const pstring就是指向char的常量指针,而非指向常量字符的指针。
注意:声明语句中用到pstring时,其基本数据类型时指针,可是改写成char*后,数据类型就变成了char,*成了声明符的一部分,这样const char就成了基本数据类型。所以pstring时一个指向char的常量指针,而const char*就是一个指向const char的指针。
auto类型说明符
auto类型能让编译器替我们去判断表达式属于的类型,因此auto必须有初始值。

auto一条声明语句只能有一个类型

复合类型、常量和auto

auto一般会忽略顶层const,同时保留底层const

如果希望auto推断出顶层const,需要明确指明

设置一个auto的引用时,初始值中的顶层const依旧保留。

要在一条语句中定义多个变量,&和*只从属于某个声明符而非基本类型的一部分,因此初始值必须时同一类型

(确实难定,有点遭不住了