空指针

发布: (2026年3月7日 GMT+8 07:22)
2 分钟阅读
原文: Dev.to

Source: Dev.to

为什么使用 nullptr 而不是 NULL0

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 通常定义为 0

0NULL 都是整型常量,所以接受 int 参数的重载比接受 void* 参数的重载匹配得更好。

使用 nullptr 选择指针重载

func(nullptr);   // 调用 func(void*)

因为 nullptr 的类型是 std::nullptr_t,它只能转换为指针类型,从而能够明确地选择指针重载。

autonullptr 的可读性

auto result = findRecord(...);

if (result == 0) {
    // …
}

if (result == nullptr) {
    // …
}

第二种比较方式明确表明 result 是一个指针,提高了代码的可读性。

趣味小知识

当你在堆上分配一个非临时对象时:

int* p = new int;

new 返回的指针是一个右值,但它指向的是左值(新创建的对象)。解引用指针会得到左值引用,而对象本身是左值,因为它拥有稳定的地址。

0 浏览
Back to Blog

相关文章

阅读更多 »