nullptr与NULL的区别及内部实现
请说明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_t(decltype(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*)。