空指针
发布: (2026年3月7日 GMT+8 07:22)
2 分钟阅读
原文: Dev.to
Source: Dev.to
为什么使用 nullptr 而不是 NULL 或 0
nullptr 拥有独特的类型 std::nullptr_t。
由于它不是整数,重载解析能够区分空指针实参和整型实参。这消除了使用 NULL(通常定义为 0)或字面量 0 时可能出现的二义性调用。
函数重载示例
void func(int);
void func(bool);
void func(void*);使用不同的空值表示进行调用
func(0); // 调用 func(int)
func(NULL); // 也调用 func(int),因为 NULL 通常定义为 00 和 NULL 都是整型常量,所以接受 int 参数的重载比接受 void* 参数的重载匹配得更好。
使用 nullptr 选择指针重载
func(nullptr); // 调用 func(void*)因为 nullptr 的类型是 std::nullptr_t,它只能转换为指针类型,从而能够明确地选择指针重载。
与 auto 和 nullptr 的可读性
auto result = findRecord(...);
if (result == 0) {
// …
}
if (result == nullptr) {
// …
}第二种比较方式明确表明 result 是一个指针,提高了代码的可读性。
趣味小知识
当你在堆上分配一个非临时对象时:
int* p = new int;new 返回的指针是一个右值,但它指向的是左值(新创建的对象)。解引用指针会得到左值引用,而对象本身是左值,因为它拥有稳定的地址。