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)
,并在<cstddef>
中typedef
为nullptr_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
参考资料:
网友评论