美文网首页
【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++笔记(1)

    variadic templates(数量不定的模板参数) nullptr c++11 使用nullptr替代NU...

  • 深入理解C++11笔记

    本文列出C++11的部分特性以及注意点与用途。 1. nullptr 为了解决的问题是: (1)nullptr的特...

  • 2019-01-08

    c++11中nullptr(与NULL的区别)[https://blog.csdn.net/justdoithai...

  • 【C++11】nullptr

    1. NULL的问题 在nullptr被提出之前,空指针通常被赋值为NULL,其是由编译器定义的宏,一般为0或者...

  • C++11之nullptr

    C++11之前,我们使用 ptr = NULL对某个指针进行初始化。同时还使用ptr == NULL进行指针是否为...

  • 【c++11关键字】nullptr

  • C++ 11:nullptr 字面值常量

    为什么会有 nullptr?这要从C++目前发展的整个趋势来讲,C++11 大部分的新特性都放在了更安全的类型和对...

  • 语言可用性的强化

    2.1 常量 nullptr关键字,专门用来区分空指针、0。而nullptr的类型为nullptr_t,能够隐式的...

  • C++11新特性(3)- 空指针(nullptr)

    以前什么样 在C语言中,使用NULL来初始化空指针。 char* pch = NULL; 在C++中,可以继续使用...

  • nullptr

    nullptr 空指针:从 0 到 NULL,再到 nullptr NULL 是一个宏定义: 引起该问题的原因是 ...

网友评论

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

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