【C++11】nullptr

1. NULL的问题

nullptr被提出之前,空指针通常被赋值为NULL,其是由编译器定义的宏,一般为0或者(void*)0。即空指针是值为0的指针。
因此在将空指针传入重载函数时,有时会产生二义性的问题,见下例

    void func(int);

    void func(char *);

    func(NULL);  // ambiguous,由于NULL定义为整数0并可指代空指针,
                 // 编译器将不确定此处是调用func(int) 还是 func(char *);

对于这种二义性问题,曾经只能通过显式转换来解决。

func((char*)NULL);  // 调用到func(char *);

2. nullptr的提出

为了解决上述历史遗留问题,需要将空指针类型与整数类型区分开,因此提出了一个新的右值常量nullptr

nullptr是C++11中新增的一个关键字,用以指定为一个不能被取址的右值常量,以取代NULL
nullptr的类型为decltype(nullptr),并在typedefnullptr_t(因此nullptr_t类型变量的值都为nullptr)。

nullptr_t类型的变量,被规定为只能被转换为指针类型(包括函数指针、成员指针等),而不能被转换为整数、布尔等其他类型。

char *p = nullptr;  // ch的值为空指针
int n = nullptr;    // error,nullptr不能被转换为int类型

PS. 有一点特殊的是,因为空指针仍然能被赋值为NULL(0),所以为了向后兼容,使用nullptr与常量0或者值为0的指针类型进行比较是允许并相等的,但是不被允许与值为0的其他类型相比较。

nullptr == 0 // ok
    
char *p = NULL;
p == nullptr // ok
    
int i = 0;
i == nullptr // error   

参考资料:

  1. A name for the null pointer: nullptr

  2. MDN reference - nullptr

你可能感兴趣的:(【C++11】nullptr)