nullptr
在 C++11 之前,使用 NULL
来表示空指针。NULL
在模版匹配和重载函数匹配语义不清晰,而 nullptr
具有更加确定和清晰的语义。
nullptr
是 c 11 中引入的新关键字,专门表示空指针,且具有特殊的类型 nullptr_t
。
nullptr_t
是一个类型,nullptr
是一个实例。
nullptr_t
并不是指针类型,但能隐式转换为任意指针类型。
nullptr_t
能和指针类型进行关系运算。
MSVC中NULL定义
#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*)
。
Difference
-
nullptr
模版推导中,
nullptr
会被推导为nullptr_t
类型。且可隐式转换为指针类型。 -
NULL
模版推导中,
NULL
会被推导为int
类型。作为int
类型,可以隐式转换为指针类型。