美文网首页
【C++11】nullptr

【C++11】nullptr

作者: JeremyYv | 来源:发表于2021-12-08 10:44 被阅读0次

    1. NULL的问题

    nullptr被提出之前,空指针通常被赋值为NULL,其是由编译器定义的宏,一般为0或者(void*)0。即空指针是值为0的指针。
    因此在将空指针传入重载函数时,有时会产生二义性的问题,见下例

        void func(int);
    
        void func(char *);
    
        func(NULL);  // ambiguous,由于NULL定义为整数0并可指代空指针,
                     // 编译器将不确定此处是调用func(int) 还是 func(char *);
    

    对于这种二义性问题,曾经只能通过显式转换来解决。

    func((char*)NULL);  // 调用到func(char *);
    

    2. nullptr的提出

    为了解决上述历史遗留问题,需要将空指针类型与整数类型区分开,因此提出了一个新的右值常量nullptr

    nullptr是C++11中新增的一个关键字,用以指定为一个不能被取址的右值常量,以取代NULL
    nullptr的类型为decltype(nullptr),并在<cstddef>typedefnullptr_t(因此nullptr_t类型变量的值都为nullptr)。

    nullptr_t类型的变量,被规定为只能被转换为指针类型(包括函数指针、成员指针等),而不能被转换为整数、布尔等其他类型。

    char *p = nullptr;  // ch的值为空指针
    int n = nullptr;    // error,nullptr不能被转换为int类型
    

    PS. 有一点特殊的是,因为空指针仍然能被赋值为NULL(0),所以为了向后兼容,使用nullptr与常量0或者值为0的指针类型进行比较是允许并相等的,但是不被允许与值为0的其他类型相比较。

    nullptr == 0 // ok
        
    char *p = NULL;
    p == nullptr // ok
        
    int i = 0;
    i == nullptr // error   
    

    参考资料:

    1. A name for the null pointer: nullptr

    2. MDN reference - nullptr

    相关文章

      网友评论

          本文标题:【C++11】nullptr

          本文链接:https://www.haomeiwen.com/subject/mcttfrtx.html