nullptr解决了什么问题
从0到NULL
在C++的世界中字面值0用来表示空指针,所以0可以当作所有指针类型的字面值。为了让语义更明确引入了NULL
宏定义:
#undef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
这说明了在C++中,NULL
是被替换为0的(在一些实现中NULL
可能被定义为0L),这是因为C++不允许void
指针隐式转换为其它类型指针,但是允许0作为各指针类型的字面值常量。
这样做虽然能用,但是却有些小缺点:1.每次使用NULL
之前都需要确保引入了该宏定义,一般引入<cstddef>
头文件;2.有些场景会遇到麻烦:
void func(char *str) {
printf("char *");
}
void func(int n) {
printf("int");
}
int main() {
func(NULL);
return 0;
}
这里本来是想调用func(char *)
版本的函数,但实际上调用的却是func(int)
版本。特别是一些实现将NULL
定义为0L的,这里编译会报二义性错误。
从NULL到nullptr
为此,C++11引入了一个新的关键字nullptr
,特意起个新名字就是为了兼容之前使用NULL
的代码。nullptr
是有类型的,并且该类型的定义来自于nullptr
本身:
typedef decltype(nullptr) nullptr_t;
nullptr
完美地解决了上面遇到的两种问题。
nullptr解决了什么问题的更多相关文章
- C++ NULL与nullptr的区别
C与C++中空指针的区别 在C里面,由于处处都要使用指针,所以导致NULL遍布各地.我们先来看C99是怎么定义NULL的: NULL can be defined as any null pointe ...
- 一起学习c++11——c++11中的新语法
c++11新语法1: auto关键字 c++11 添加的最有用的一个特性应该就是auto关键字. 不知道大家有没有写过这样的代码: std::map<std::string, std::vect ...
- OpenGL Compute Shader靠谱例子及读取二进制Shader,SPIR-V
学OpenGL以来一直苦恼没有像DX那样可以读取二进制Shader使用的方法,除去有时不想公开自己写的牛逼Shader的心理(虽然目前还从没写过什么牛逼的Shader), 主要是不用现场编译,加快读取 ...
- 解决:function in namespace ‘std’ does not name a type + allocator_/nullptr/dellocator_ was not declared + base operand of ‘->’ has non-pointer type ‘std::vector<cv::Mat>’ 错误编译时报错(caffe)
解决方法,用到了c++11,g++命令需要加上-std=c++11选项 附:g++默认的c++标准 gcc-6.4.0 gcc-7.2.0 默认是 -std=gnu++14gcc-4.3.6 gcc- ...
- 图之BFS和DFS遍历的实现并解决一次旅游中发现的问题
这篇文章用来复习使用BFS(Breadth First Search)和DFS(Depth First Search) 并解决一个在旅游时遇到的问题. 关于图的邻接表存储与邻接矩阵的存储,各有优缺点. ...
- nullptr和NULL 区别
注:本文内容摘自网络,准确性有待验证,现阶段仅供学习参考.尊重作品作者成果,原文链接 :http://www.2cto.com/kf/201302/190008.html 1.为什要有nullptr ...
- 聊一聊c++中指针为空的三种写法 ----->NULL, 0, nullptr
看到同事用了一下nullptr.不是很了解这方面东东,找个帖子学习学习 http://www.cppblog.com/airtrack/archive/2012/09/16/190828.aspx N ...
- c++11 NULL、0、nullptr
C的NULL 在C语言中,我们使用NULL表示空指针,也就是我们可以写如下代码: int *i = NULL;foo_t *f = NULL; 实际上在C语言中,NULL通常被定义为如下: #de ...
- 解决 CefSharp WPF控件不能使用输入法输入中文的问题(代码已提交到 github)
首先,本文所有 代码已经提交到github,需要的可以直接从github获取:https://github.com/starts2000/CefSharp,希望可以帮助到有需要的朋友们. CEF 简介 ...
随机推荐
- IDEA下Git分支开发
IDEA下Git分支开发使用 1.新建本地开发分支 VCS-->git-->branches-->New Branch,输入分支名字,如branch_test,点击OK后本地开发分支 ...
- python3 if
if-else python中特有if-elif-else语句
- 向你的C语言项目中加入多线程
C语言在标准库<pthread.h>中为程序员提供了多线程操作接口. 先从简单操作入手 int pthread_create(pthread_t *thread, pthread_attr ...
- SpringBoot中使用切面的每次传的参数,进行解析,验签,并返回解码后的参数
目的,在每次请求的时候,对每次传的参数,进行解析,验签,并返回解码后的参数, 以json传递: 例子背景: IOT平台提供对外可访问的接口, 需要对所有参数的传递做到 不泄露.认证的目的:所以需要在每 ...
- C#开发PACS医学影像处理系统(十八):Dicom使用LUT色彩增强和反色
在医生阅片确诊的过程中,当发线疑似病灶时在灰度显示下有时并不清晰,这时候就需要色彩增强效果来使灰度图像变为彩色图像. LUT可以简单的理解为0-255的颜色映射值,例如:彩虹编码,将其打包成LUT格式 ...
- ES6重度学习 demo实例
let 与 const // 并非真正的常量 // const 的本质: const 定义的变量并非常量,并非不可变, // 它定义了一个常量引用一个值.使用 const 定义的对象或者数组,其实是可 ...
- 熬夜23天吃透,九大核心专题,成功收割了阿里、百度、美团3家offer
前言 今年受疫情影响非常大,春招和金三银四都要比往年来得更迟一些.春招结束之后,我特意把自己的面试经历顺了顺,总结出了不少的经验.对了,这次一共收割了3个大厂offer,分别是蚂蚁金服.美团和网易,特 ...
- 《Head First 设计模式》:状态模式
正文 一.定义 状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类. 要点: 状态模式允许一个对象基于内部状态而拥有不同的行为. 状态模式将状态封装成为独立的类,并将动作委托到代 ...
- Swiper 在IE9 及其他浏览器使用
Swiper 在IE9 及其他浏览器使用 前言 昨天遇到一个问题,swiper 使用版本是3.4.2 除了Ie9浏览器外其他浏览器都正常,IE9 无法轮播,执行控制台报错源码问题.没办法,只能降级兼容 ...
- zookeeper 笔记--curator分布式锁
使用ZK实现分布式独占锁, 原理就是利用ZK同级节点的唯一性. Curator框架下的一些分布式锁工具InterProcessMutex:分布式可重入排它锁 InterProcessSemaphore ...