nullptr/nullptr_t
解释
关键词 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相关推荐
- C++11:nullptr_t与nullptr的原理
引言 C++98标准定义空指针是NULL,NULL是一个Macro常量,定义格式: #ifdef __cplusplus #define NULL 0 #else #define NULL ((voi ...
- iOS开发-NULL和nullptr和nil和Nil还有NSNull
2019独角兽企业重金招聘Python工程师标准>>> NULL和nullptr 在Clang 6.0 的stddef.h文件中可以找到NULL和nullptr的声明: 1 2 3 ...
- 空指针:从 0 到 NULL,再到 nullptr
nullptr 空指针:从 0 到 NULL,再到 nullptr NULL 是一个宏定义: #undef NULL #if defined(__cplusplus) #define NULL 0 # ...
- C++起始(内联函数,宏的优缺点,const关键字,auto关键字(C++11)基于范围的for循环(C++11). 指针空值nullptr(C++11))
内联函数 概念 以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销, 内联函数提升程序运行的效率 函数前增加inline关键字将其改成内联函数,在编 ...
- Effective Modern C++[实践]->优先使用nullptr,而非0或NULL
优先使用nullptr 回看旧识 空指针 `void*` 在`c++`中必须显式地将`malloc`的返回值类型转换为`(int *)`. 不知`void *`所指,如何强转 `void*` 不能直接 ...
- C++中的糖果——缺省参数、内联函数、auto及nullptr关键字
在C++中,相对于C语言,我们引入了许多新的概念,新的机制,它们的到来让我们的编程方便了不少,它并没有多么难理解,但是比较零碎,在我看来它就是一些加分项,故此,我们通常也将其称为C++中的糖果.下面就 ...
- C++基础:指针空值(nullptr)
初始化指针是将其指向一个"空"位置,比如0.由于大多数计算机系统不允许用户程序写地址为0的内存空间,倘若程序无意中对该指针所指地址赋值,通常在运行时就会导致程序退出.虽然程序退出并 ...
- 指针空值——nullptr
以c语言和c++分别运行以下代码,大家可以先猜猜此程序在不同环境中的运行结果是什么,会不会有什么不同~ #include<stdio.h> void func(char* p) {prin ...
- C++11新特性之nullptr
在C++11之前的C++98/03我们使用空都是NULL关键字,后来C++11之后新增了nullptr关键字来表示空.那么有了NULL还要弄个nullptr出来干什么呢?是不是吃太饱了? 为了来剖析这 ...
最新文章
- java 取出集合前两个数据库_【Java】获取两个List中不同的数据(效率非常不错)-Go语言中文社区...
- 仿射密码介绍以及解题脚本
- vue路由切换和用location切换url的区别
- 切莫开一块地荒一块地
- linux符号命令,Linux_几个符号命令(示例代码)
- 树的直径,树的最长路dp思想
- android jackson 解析json字符串,一文搞定Jackson解析JSON数据
- 串口发送字符串到串口软件
- 软件生命周期、面向对象基本概要
- LeetCode详细题解-Java版
- Linux系统中PostgreSQL客户端的安装
- xgene:WGS,突变与癌,RNA-seq,WES
- 计算机表格如何增加一列,word中的表格如何增加一列 word表格怎么增加一列
- xp系统启动时0x0000007B(0XF799A524,0XC0000034,0X00000000,0X00000000)错误
- 如何关闭 Win 10 系统自动更新
- C++ 线段树,树状数组
- Android新手爬坑之路——Failed to find provider info for com.example.databasetest.provider
- IOS-简单的自建ipa在线安装服务
- 老旗舰华为能用上鸿蒙吗,千元机也能用鸿蒙!曝荣耀 9X 手机年内全部升级鸿蒙系统...
- 针对瑞萨单片机编译时空间无法全部使用问题的解决方案