1、nullptr
- (1) nullptr是一个关键字,而nullptr_t是一个类型
- typedef decltype(nullptr) nullptr_t
- 使用nullptr_t类型必须包含#include <cstddef>,而nullptr不需要包含任何头文件。
- nullptr_t类型可以隐式转换为任意一种指针类型;如:std::nullptr_t test;char* s = test;
- nullptr_t类型不适用于算数表达式,但是适用于关系表达式。
- (2) nullptr是有类型的,仅可以被隐式转换为指针类型
- 和NULL的不同,NULL的定义有二义性,有时其定义为0,有时定义为void*(0)
- (3) 模板只能将nullptr_t作为一个普通类型来推导,而不会将其视为T*指针,因此要让编译器成功的推导出nullptr_t的类型,必须做显式的类型转换。
- (4) nullptr类型所占用的内存空间大小和void*是相同的。即:(sizeof(nullptr) == sizeof(void*))
- (5) nullptr与void*的区别
- nullptr是编译时期的常量,是编译时期的一个关键字,可以被编译器识别。void*(0)是一个强制转换表达式,返回值也是void*类型
- nullptr到任何指针的转换都是隐式的,而void*要转换为其他类型必须强制转换。【注意C语言void*可以隐式转换为任意指针,而C++不行】
2、constexpr
2.1 constexpr常量表达式函数
2.1.1 常量表达式要解决的问题
在编码的过程中,我们会遇到下面的情况:
const int test1() {
return 1;
}
int main() {
int a[test1()] = {
0};