nullptr是有类型的(定义于cstddef文件),NULL只是一个宏定义而已。

typedef decltype(nullptr) nullptr_t;

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

在C语言环境下,由于不存在函数重载等问题,直接将NULL定义为一个void*的指针就可以完美的解决一切问题。
但是在c++环境下情况就变得复杂起来, 首先我们不能写这样的代码 FILE* fp = (void*)0; 将void*直接赋值给一个指针是不合法的,编译器会报错。 我们只能这样写代码:

FILE* fp = (FILE*)0;  
// or
FILE* fp = 0;

所以在c++下面,NULL就被直接定义为一个整型 0。 在大多数情况下这并不会产生什么问题,但是万一有重载或者模板推导的时候,编译器就无法给出正确结果了。比如下面的情形:

template<class F, class A>
void test(F f, A a)
{
f(a);
}
void f(void*)
{
cout << 1;
}
test(f, NULL); //这里会报无匹配

所以在C++中,强烈建议使用nullptr,摒弃NULL。

不能将nullptr赋值给整型:

if (nullptr == 0)  //rihgt, 两者等价
cout << 1;

if (nullptr == NULL) //rihgt, C++中NULL就是0,和上面的等价
cout << 1;

int a = 0;
if (nullptr == a) //error
cout << 1;

const int b = 0;
if (nullptr == b) //right, b 是一个立即数,所以正确
cout << 1;

if (nullptr == (int)0) //right
cout << 1;