1、空指针常量nullptr
· 为了解决函数重载是传入NULL(0)的二义性,C++11引入了关键字nullptr充当空指针常量。
· nullptr的类型是nullptr_t:
(1) 可以隐式转换为任意类型的指针或者指向任何成员。
(2) 不能隐式转换为整型,可以隐式转换为bool类型代表false。
(3) 可以和除了整型和bool型的其他类型比较。
2、泛化的常量表达式(constexpr)
C++11引入了constexpr关键字,允许用户去保证一个函数或者对象的构造函数是一个编译器常量。
说明:
a、constexpr是指值不会改变而且在编译过程就能计算结果的表达式。
b、一个表达式是不是常量表达式由它的数据类型和初始值共同决定。
c、constexpr只对指针有效,对指针所指的对象无关。
d、为了使函数获取编译时计算的能力,需要指定constexpr关键字。
e、以constexpr修饰的函数被允许应用在调用宏的所有场合。
f、编译时使用对象,需要将构造函数声明为constexpr。
g、声明为constexpr则包含了const。
3、constexpr函数的限制
a、函数中只能有一个return语句(有极少特例)
b、只能调用其他constexpr函数。
c、只能使用全局constexpr变量。
d、递归并不受限制,但只允许一个返回语句,可以使用三元运算符。
e、constexpr函数,只允许包含一行可执行代码。但允许包含typedefs、using declaration&&directives、静态断言等。
f、一个声明为constexpr的函数同样可以在运行时被调用,即当这个函数的参数是非常量的时候。
constexpr int get_num()
{
//int i = 9; error, 函数体内不能声明变量
return 5;
}
int main()
{
int value[get_num() + 7];//C++11合法
const int i = 20;//是常量表达式,值不会改变,编译器确定值
const int i2 = num + 1;//是常量表达式
int size = 27; //值会改变
//const int sz = get_size();//编译器无法确定sz的值
constexpr int num = 20; //是字面值常量
constexpr int num2 = num + 1; //是字面值常量
//constexpr int num3 = getnum();//getnum函数需要是constexpr函数
int ss = 0;
constexpr int *p = nullptr; //指向整型的常量指针,p不可变
int constexpr * r = nullptr;
const int *q = nullptr; //指向一个整型常量的指针,*q不可变
int * const m = nullptr;//指向一个整型的常量指针,m不可变
int const *n = nullptr;//指向一个整型常量的指针, *n不可变
}