303 字
2 分钟
nullptr
在 C++11 之前,使用 NULL 来表示空指针。NULL 在模版匹配和重载函数匹配语义不清晰,而 nullptr 具有更加确定和清晰的语义。
nullptr 是 c 11 中引入的新关键字,专门表示空指针,且具有特殊的类型 nullptr_t。
1. nullptr_t 是一个类型,nullptr 是一个实例。
2. nullptr_t 并不是指针类型,但能隐式转换为任意指针类型。
3. nullptr_t 能和指针类型进行关系运算。
#ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif#endif-
cpp 中
void*类型不能隐式转换成其他的类型指针。int* p = (void*)0在 cpp 中是非法的。 -
cpp 中
0或NULL是能隐式转换成指针类型的。int* p = NULL和int* p = 0是合法的。 -
cpp 中认为一个指针变量为 0 时为空指针。
MSVC 中如果存在函数 f(int) 和重载版本 f(int*),那么 NULL 会被匹配到 f(int),而 int* p = NULL 会被匹配到 f(int*)。
NOTEDifference
nullptr
模版推导中,
nullptr会被推导为nullptr_t类型。且可隐式转换为指针类型。
NULL
模版推导中,
NULL会被推导为int类型。作为int类型,可以隐式转换为指针类型。