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 中 0NULL 是能隐式转换成指针类型的。int* p = NULLint* 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 类型,可以隐式转换为指针类型。