《深入理解C++11》笔记-指针空指nullptr

上一篇:《深入理解C++11》笔记-原子类型和原子操作
本篇开始结束第7章的内容:指针空值nullptr。

nullptr、NULL和0

在C++11之前对指针变量初始化的典型做法是将其指向一个空的位置,比如0、NULL。这是由于大多数计算机系统不允许用户程序写地址为0的内存地址,如果程序对该地址进行赋值,通常会引起程序异常。一般情况下,这样做没有问题,但是有时候会遇到有些麻烦:

void func(int i)
{
    std::cout << "int" << std::endl;
}

void func(void* p)
{
    std::cout << "ptr" << std::endl;
}

int main()
{
    func(0);                   // int
    func(NULL);                // int,本意是调用指针函数,实际却调用了int函数
    func((void*)0);            // ptr

    getchar();
    return 0;
}

以上的代码中func(NULL);本意是调用指针函数,实际却调用了int函数,因为NULL被定义成了0。虽然在前面加上(void*)强制转换能解决这个问题,但是某些编译器缺会在产生这种二义性时报错,多以对于代码移植来说会有一定限制。于是C++11中新增了nullptr来代表指针空值,以上问题就得到了解决:

int main()
{
    func(0);                   // int
    func(nullptr);             // ptr
    func((void*)0);            // ptr

    getchar();
    return 0;
}

nullptr和nullptr_t

同时,C++11还定义了指针空值类型nullptr_t,就是说指针空值并非只有nullptr一个实例,也可以通过nullptr_t来声明一个空指针类型的变量,虽然好像没什么用。另外,nullptr_t也规定了一些规则:

  • 所有定义为nullptr_t类型的数据都是等价的,行为也完全一致。
  • nullptr_t类型数据可以隐式转换成任意一个指针类型。
  • nullptr_t类型数据不能转换成非指针类型。
  • nullptr_t类型数据不适用于算术运算表达式。
  • nullptr_t类型数据可以用于关系运算表达式,但是只能和nullptr_t类型或者指针类型进行比较。

nullptr_t类型还是比较有意思的,它的定义是从nullptr反推而来,从这点又能看出C++11用法的灵活性:

typedef decltype(nullptr) nullptr_t;

下一篇:《深入理解C++11》笔记-默认函数的控制

猜你喜欢

转载自blog.csdn.net/wizardtoh/article/details/81164740