解释

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

引入原因

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

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

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

/* Define NULL pointer value */#ifndef NULL    #ifdef __cplusplus        #define NULL    0    #else  /* __cplusplus */        #define NULL    ((void *)0)    #endif  /* __cplusplus */#endif  /* NULL */

C中NULL规定为void*指针:

#define  NULL  ((void*)0)

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

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

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

void foo(char *);void foo(int);#include <iostream>#include <typeinfo>int main(){  std::cout << "" << typeid(NULL).name() << std::endl;}foo(0); // 调用 foo(int)// foo(NULL); // 该行不能通过编译foo(nullptr); // 调用 foo(char*)

std::nullptr_t

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

typedef decltype(nullptr) nullptr_t;

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

nullptr/nullptr_t相关推荐

  1. C++11:nullptr_t与nullptr的原理

    引言 C++98标准定义空指针是NULL,NULL是一个Macro常量,定义格式: #ifdef __cplusplus #define NULL 0 #else #define NULL ((voi ...

  2. iOS开发-NULL和nullptr和nil和Nil还有NSNull

    2019独角兽企业重金招聘Python工程师标准>>> NULL和nullptr 在Clang 6.0 的stddef.h文件中可以找到NULL和nullptr的声明: 1 2 3 ...

  3. 空指针:从 0 到 NULL,再到 nullptr

    nullptr 空指针:从 0 到 NULL,再到 nullptr NULL 是一个宏定义: #undef NULL #if defined(__cplusplus) #define NULL 0 # ...

  4. C++起始(内联函数,宏的优缺点,const关键字,auto关键字(C++11)基于范围的for循环(C++11). 指针空值nullptr(C++11))

    内联函数 概念 以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销, 内联函数提升程序运行的效率 函数前增加inline关键字将其改成内联函数,在编 ...

  5. Effective Modern C++[实践]->优先使用nullptr,而非0或NULL

    优先使用nullptr 回看旧识 空指针 `void*` 在`c++`中必须显式地将`malloc`的返回值类型转换为`(int *)`. 不知`void *`所指,如何强转 `void*` 不能直接 ...

  6. C++中的糖果——缺省参数、内联函数、auto及nullptr关键字

    在C++中,相对于C语言,我们引入了许多新的概念,新的机制,它们的到来让我们的编程方便了不少,它并没有多么难理解,但是比较零碎,在我看来它就是一些加分项,故此,我们通常也将其称为C++中的糖果.下面就 ...

  7. C++基础:指针空值(nullptr)

    初始化指针是将其指向一个"空"位置,比如0.由于大多数计算机系统不允许用户程序写地址为0的内存空间,倘若程序无意中对该指针所指地址赋值,通常在运行时就会导致程序退出.虽然程序退出并 ...

  8. 指针空值——nullptr

    以c语言和c++分别运行以下代码,大家可以先猜猜此程序在不同环境中的运行结果是什么,会不会有什么不同~ #include<stdio.h> void func(char* p) {prin ...

  9. C++11新特性之nullptr

    在C++11之前的C++98/03我们使用空都是NULL关键字,后来C++11之后新增了nullptr关键字来表示空.那么有了NULL还要弄个nullptr出来干什么呢?是不是吃太饱了? 为了来剖析这 ...

最新文章

  1. java 取出集合前两个数据库_【Java】获取两个List中不同的数据(效率非常不错)-Go语言中文社区...
  2. 仿射密码介绍以及解题脚本
  3. vue路由切换和用location切换url的区别
  4. 切莫开一块地荒一块地
  5. linux符号命令,Linux_几个符号命令(示例代码)
  6. 树的直径,树的最长路dp思想
  7. android jackson 解析json字符串,一文搞定Jackson解析JSON数据
  8. 串口发送字符串到串口软件
  9. 软件生命周期、面向对象基本概要
  10. LeetCode详细题解-Java版
  11. Linux系统中PostgreSQL客户端的安装
  12. xgene:WGS,突变与癌,RNA-seq,WES
  13. 计算机表格如何增加一列,word中的表格如何增加一列 word表格怎么增加一列
  14. xp系统启动时0x0000007B(0XF799A524,0XC0000034,0X00000000,0X00000000)错误
  15. 如何关闭 Win 10 系统自动更新
  16. C++ 线段树,树状数组
  17. Android新手爬坑之路——Failed to find provider info for com.example.databasetest.provider
  18. IOS-简单的自建ipa在线安装服务
  19. 老旗舰华为能用上鸿蒙吗,千元机也能用鸿蒙!曝荣耀 9X 手机年内全部升级鸿蒙系统...
  20. 针对瑞萨单片机编译时空间无法全部使用问题的解决方案

热门文章

  1. HDU 5919 Sequence II 主席树
  2. LVS practice
  3. 内存管理范围和@property
  4. 关于EGE图形库在CodeBlocks下的配置
  5. Java 并发专题 :FutureTask 实现预加载数据 在线看电子书、浏览器浏览网页等
  6. 【转载】数字签名是什么?
  7. [网络安全自学篇] 九十.远控木马详解及APT攻击中的远控和防御
  8. 【数据结构与算法】之深入解析“搜索旋转排序数组”的求解思路与算法示例
  9. 【数据结构与算法】之容器盛最多水的算法实现
  10. Python生成列表的所有子集