nullptr与null

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;

你可能感兴趣的:(C++)