一杯清酒邀明月
天下本无事,庸人扰之而烦耳。
posts - 3121,comments - 209,views - 578万

解释
关键词 nullptr 代表指针字面量。它是 std::nullptr_t 类型的纯右值。存在从 nullptr 到任何指针类型及任何成员指针类型的隐式转换。同样的转换对于任何空指针常量也存在,空指针常量包括 std::nullptr_t 的值,以及宏 NULL。

引入原因

为什么引入nullptr呢, 不是有NULL这个关键字么?

的确,但是我想问你NULL是什么类型的?

C++98中NULL是个宏定义,明确规定NULL是个整型0值:

复制代码
1 /* Define NULL pointer value */
2 #ifndef NULL
3     #ifdef __cplusplus
4         #define NULL    0
5     #else  /* __cplusplus */
6         #define NULL    ((void *)0)
7     #endif  /* __cplusplus */
8 #endif  /* NULL */
复制代码

C中NULL规定为void*指针:

#define  NULL  ((void*)0)

可以看出,C和C++中NULL的规定是不同的,原因在于C++的重载机制。

1 void foo(int) {}
2 void foo(int*) {}
3 
4 foo(0);  // 调用foo(int)而不是foo(int*)
5 foo(NULL);  // 如果NULL是0,则调用foo(int); 如果NULL是0L,则编译错误

C++98规定NULL是一个整型0值,根据不同的编译器实现,可能是0或0L。更尴尬的是,可以拿NULL当合法的整型(int或者long)来使用,所以C++11引入了nullptr表示指针的0值,虽然它不是指针类型,但是它能够转换成任何指针,而且它不能转换成int或者其他类型:

复制代码
 1 oid foo(char *);
 2 void foo(int);
 3 #include <iostream>
 4 #include <typeinfo>
 5 int main()
 6 {
 7   std::cout << "" << typeid(NULL).name() << std::endl;
 8 }
 9 foo(0); // 调用 foo(int)
10 // foo(NULL); // 该行不能通过编译
11 foo(nullptr); // 调用 foo(char*)
复制代码

std::nullptr_t

nullptr也有其自身的类型,它的类型为std::nullptr_t。std::nullptr_t本身不是指针类型,但是它可以转换为任何指针类型,这也就是nullptr可以看做任何指针类型的原因。它的定义如下:

typedef decltype(nullptr) nullptr_t;

上面是一个很有趣的类型定义。通常情况是先有类型,然后才有该类型的变量。而上面的定义则是,先有一个某类型的字面值,再由这个字面值定义它的类型。妙哉!

posted on   一杯清酒邀明月  阅读(232)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
历史上的今天:
2021-11-02 Qt 程序报错“the inferior stopped because it triggered an exception”
2020-11-02 Qt QMainWindow中利用多个QDockWidget构成标签页tab || tabifyDockWidget
2020-11-02 Qt QDockWidget属性 setFeatures、setAllowedAreas
2020-11-02 Qt Designer中toolBar的allowedAreas属性
2020-11-02 Qt QSizePolicy
2020-11-02 Qt(Python+Qt)QMainWindow的splitDockWidget方法将QDockWidget停靠窗分割排列
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示