1--constexpr
常量表达式表示值不会改变,在编译过程中就能得到计算结果的表达式;C++11新标准允许将变量声明为 constexpr 类型,以便由编译器来验证变量的值是否是一个常量表达式;
声明为 constexpr 的变量一定是一个常量,必须用常量表达式进行初始化;
C++新标准允许定义一种特殊的 constexpr 函数,其足够简单以使编译阶段就能计算结果;可以用 constexpr 的函数去初始化 constexpr 的变量;
constexpr int mf = 20; // 20是常量表达式
constexpr int limit = mf + 1; // mf + 1是常量表达式
constexpr int sz = size(); // 只有当 size 是一个 constexpr 函数时,其是一条正确的声明语句;
一个 constexpr 指针的初始值必须是 nullptr 或 0,或者是存储于某个固定地址中的对象;
在 constexpr 声明中如果定义了一个指针,则限定符 constexpr 仅对指针有效,与指针所指的对象无关;
const int *p = nullptr; // p是一个指向整型常量的指针(即*p不可变,p可变)
constexpr int *q = nullptr; // q是一个指向整数的常量指针(即*q可变, q不可变)
一般来说,如果认定变量是一个常量表达式,则可以将其声明为 constexpr 类型;
2--using
传统的方法是使用关键字 typedef 来定义类型别名;C++11新标准允许使用关键字 using,即使用别名声明来定义类型的别名;
using A = B;
关键字 using 作为别名声明的开始, A 为别名,代码的作用是将等号左侧的名字 A 规定为等号右侧类型 B 的别名;
typedef char *pstring;
const pstring cstr = 0; // 语句①
const char *cstr = 0; // 语句②
语句①和语句②的作用不同,语句①声明了一个指向 char 的常量指针(即 cstr 不可变, *cstr 可变),而语句②声明了一个指向常量 const char 的指针(即 *cstr 不可变,cstr 可变);
3--auto
C++11新标准引入 auto 类型说明符,使编译器自动分析表达式所属的类型,即 auto 使编译器根据初始值自动推导变量的类型,则 auto 定义的变量必须有初始值;
auto A = B + C; // 根据 B + C 的结果来推断A的类型
使用 auto 在一条语句中可以声明多个变量,但一条声明语句只能有一个基本数据类型;
auto A = 0, B = 3.14; // 错误,因为A和B的数据类型不一致,违反auto一条声明语句中只有一个基本数据类型的原则;
4--decltype
C++11新标准引入 decltype 类型说明符,其作用是选择并返回操作数的数据类型;通过 decltype 类型说明符,可以推断出定义变量的类型,而无需用表达式的值来初始化变量;
decltype(f()) sum = x;
// sum的类型就是函数f的返回类型
const int A = 0;
decltype(A) B = 0; // B的类型是const int
decltype((variable))的结果是引用,而decltype(variable)的结果当且仅当variable是一个引用时才是引用;
int A = 42;
decltype((i)) B ; // 错误,因为B的类型是 int &,引用必须初始化;
decltype(i) C; // 正确,C是一个未被初始化的 int