Nullptr

定义

在C语言中，空指针可以使用(void *)0;来表示，且标准库中也是如此定义，但在C++语言中，由于对语法的类型检查更为严格，因而空指针的值就不能表示为(void *)0;。例如，空指针的值表示为FILE *fp=(void *)0;编译报错。所以至少自C++98开始#define NULL 0。 但这会在函数重载时遇到新的困难。例如
void foo(char c, void *p);void foo(char c, int i);int main(){
    foo('x',NULL);//匹配哪个版本的foo()？}
C++11开始，定义了空指针的常值为nullptr，解决了上述函数重载问题。
在没有C++11的nullptr时，可以自己实现一个：
const class nullptr_t{public:
    template<class T>
    inline operator T*() const
        { return 0; }

    template<class C, class T>
    inline operator T C::*() const
        { return 0; }
 
private:
    void operator&() const;} nullptr = {};
C++语言标准规定： 值0或std::nullptr_t类型的纯右值是空指针常量（null pointer constant）。可以通过空指针转换(null pointer conversion)成为某个类型的空指针值(null pointer value)。
C++语言标准还规定，在实参个数多于形参个数时（即可变参数个数的函数调用，可用va_arg来访问），多出来的实参如果是std::nullptr_t类型，则转化为(void *)0供函数访问。
std::nullptr_t定义在标准头文件<cstddef>中。但实际上在源程序中不包含该头文件仍可以正常使用nullptr_t类型与nullptr对象。

nullptr_t

nullptr_t是字面常量nullptr的数据类型。它是一种特殊的类型，并不是一种指针类型也不是指向任何种变量类型的指针类型。nullptr_t位于std名字空间中，且定义于<cstddef>头文件中。可透过is_null_pointer来检查对象是否为这种类型。