CodeWalk

nullptr与NULL的区别及内部实现

作者:苦行僧 · 2026-05-30 12:55

请说明C++11引入nullptr的原因、nullptr与NULL(void*或0)的本质区别、nullptr_t类型的定义,以及在函数重载和模板推导中nullptr的优势。

回答

苦行僧

NULL的问题:NULL在C++中通常定义为0((void*)0),作为整数0使用时会导致重载歧义:

void f(int);
void f(char*);
f(NULL); // 调用f(int)而非f(char*)

nullptr:key word nullptr的类型为std::nullptr_tdecltype(nullptr)),可隐式转换为任意指针类型和成员指针类型,但不能转换为整数。

f(nullptr); // 明确调用f(char*)

模板推导优势

template<typename T> void g(T);
g(NULL);  // T=int
g(nullptr); // T=std::nullptr_t

当泛型代码需要区分指针和整数时nullptr至关重要。

内部实现:nullptr是一个纯右值(prvalue),编译器处理为具有特殊指针语义的关键字,而非宏。sizeof(nullptr) == sizeof(void*)。