为什么要用 nullptr 而不是 NULL(ο´・д・)??
1. nullptr 有独立的类型:std::nullptr_t
-
只表示“空指针”。
-
类型明确,避免类型不一致问题。
void f(int){ cout<<"NULL"<<endl;};
void f(int*){ cout<<"nullptr"<<endl;};
f(NULL); // 调用 f(int) —— 因为 NULL 是 0
f(nullptr); // 调用 f(int*) —— 正确
std::nullptr_t是空指针字面量 nullptr 的类型。它是一种不同的类型,本身不是指针类型或指向成员的指针类型。此类型的纯右值是空指针常量,并且可以隐式转换为任何指针和指向成员的指针类型。sizeof(std::nullptr_t)等于sizeof(void *)。
2. NULL 本质是 0 或 ((void*)0)
在 C++ 中通常是:
#define NULL 0
// since C++11
#define NULL nullptr
这会导致函数重载、模板推导出现歧义。
在 C 中,宏
NULL可能具有类型 void*,但在 C++ 中不允许,因为空指针常量不能具有该类型。
什么时候必须用 nullptr?
- 初始化指针
- 判断指针是否为空
- 作为函数参数传递空指针
- 返回空指针
ListNode* head = nullptr;
if (head == nullptr) {
// ...
}
return nullptr;