c++ nullptr与NULL区别_c++11空指针规范
技术百科
穿越時空
发布时间:2026-01-01
浏览: 次 NULL本质是整数0,重载时优先匹配int参数而非指针;nullptr是std::nullptr_t类型,只向指针隐式转换,确保类型安全。
函数重载时传 N
ULL 为什么常调错版本?
因为 NULL 本质是宏,C++ 中多数编译器定义为 0(int 类型),不是指针。当存在两个重载函数时,编译器优先匹配整数参数——哪怕你本意是传空指针。
-
void func(int)和void func(char*)同时存在时:func(NULL)会调用func(int),而不是你预期的指针版本 -
func(nullptr)则**一定**匹配func(char*),因为nullptr的类型是std::nullptr_t,只向指针类型隐式转换 - VS、GCC、Clang 在 C++11+ 模式下行为一致,但老项目若混用 C 风格头文件(如
),NULL定义可能更混乱
模板推导中 NULL 会悄悄“变类型”?
是的。NULL 是整数,进模板后常被推成 int;而 nullptr 进模板永远是 std::nullptr_t,再由上下文决定转成什么指针——这才是你想要的语义。
-
auto x = NULL;→x类型是int(危险!后续误当指针用就崩) -
auto y = nullptr;→y类型是std::nullptr_t,且能安全用于int*、std::string*等任何指针上下文 - 智能指针初始化也一样:
std::unique_ptr编译通过但语义错误;p = NULL; std::unique_ptr才是标准写法p = nullptr;
能不能把 NULL 全局替换成 nullptr?要注意什么?
可以,但别用 IDE “全文件替换”一刀切——尤其注意 C 头文件和跨语言接口代码。
- 纯 C++11+ 项目:直接全局搜索
= NULL、(NULL)、== NULL,替换成= nullptr等,基本安全 - 含 C 代码或
extern "C"接口时,NULL可能被 C 编译器要求(比如系统 API 参数),此时保留NULL更稳妥 - 宏定义里用到
NULL(如#define SAFE_DELETE(p) do { delete p; p = NULL; } while(0)),建议改写为p = nullptr,但需确认所有使用该宏的指针类型兼容 - 检查构建日志:替换后若出现
error: cannot convert 'int' to 'xxx*' in assignment,说明某处NULL原本被当整数用了(比如数组索引),不能硬换
不升级到 C++11 就不能用 nullptr?
是的。nullptr 是 C++11 标准关键字,C++98/03 编译器(如旧版 VC6、GCC 4.1 以下)根本不认识它,会报 error: 'nullptr' was not declared in this scope。
- 若必须支持老标准,可用轻量模拟(非完全等价):
const class nullptr_t { public: templateoperator T*() const { return 0; } template operator T C::*() const { return 0; } private: void operator&() const; } nullptr = {}; - 但强烈不建议在生产环境手写模拟——它无法参与 SFINAE、不支持
decltype(nullptr)、与标准库智能指针交互可能出问题 - 真正要长期维护的老项目,优先考虑升级工具链;临时兼容可加条件编译:
#if __cplusplus >= 201103L分支处理
nullptr 不是“可选项”,而是类型安全的底线——它不解决新功能,但堵住了 NULL 留下的所有歧义入口。最易忽略的点是:**连 if (ptr == NULL) 这种看似无害的判断,都可能因宏展开或重载干扰,在复杂模板中引发静默类型退化**。
# 才是
# 用了
# 要注意
# 就不
# 不支持
# 工具
# auto
# Error
# c++
# 隐式转换
# String
# if
# int
# void
# 函数重载
# 区别
# 标准库
# 指针
# 接口
# 为什么
# red
# this
# delete
# NULL
# define
# 头文件
# while
# extern
# 指针类型
# 隐式
# char
# 空指针
# 会报
# ide
# 不认识
# 重载函数
# 替换成
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11怎么开启智能存储_Windows11存储
- Python多进程教程_multiprocessi
- 如何高效获取循环末次生成的 NumPy 数组最后一
- Python函数缓存机制_lru_cache解析【
- Python路径拼接规范_跨平台处理说明【指导】
- c++中的std::conjunction和std
- Linux如何使用grep搜索文件内容_Linux
- 使用类变量定义字符串常量时如何实现类型安全的 Li
- 微信短链接怎么还原php_用浏览器开发者工具抓包获
- php怎么捕获异常_trycatch结构处理运行时
- Win11如何设置开机自动联网 Win11宽带连接
- Windows怎样关闭Edge新标签页广告_Win
- php打包exe怎么传递参数_命令行参数接收方法【
- 如何使用Golang log设置日志输出格式_Go
- Win11怎么关闭应用权限_Windows11相机
- 如何自定义Windows终端的默认配置文件?(Po
- 如何使用Golang template生成文本模板
- MAC如何设置网卡MAC地址克隆_MAC终端修改物
- 如何减少Golang内存碎片化_Golang内存分
- 如何使用Golang encoding/json解
- php怎么下载安装后无法解析php文件_服务器配置
- Win11怎么开启远程桌面_Win11系统远程桌面
- Win10电脑怎么设置休眠快捷键_Windows1
- Win11怎么关闭SmartScreen_禁用Wi
- Go 中 defer 语句在 goroutine
- PhpStorm怎么调试PHP代码_PhpStor
- Win10如何更改用户账户控制_Windows10
- Drupal 中渲染节点时出现 HTML 标签嵌套
- LINUX的SELinux是什么_详解LINUX强
- Python面向对象实战讲解_类与设计模式深入理解
- php订单日志权限怎么设_php订单日志文件权限设
- Windows10电脑怎么设置虚拟光驱_Win10
- c++中的Tag Dispatching是什么_c
- Python对象比较与排序_集合使用说明【指导】
- 如何开启Windows的远程服务器管理工具(RSA
- 如何在Golang中理解指针比较_Golang地址
- 如何在 Go 中比较自定义的数组类型(如 [20]
- Win11怎么关闭自动修复_跳过Win11开机自动
- 如何在Golang中修改数组元素_通过指针实现原地
- 用Python构建微服务架构实践_FastAPI与
- 如何在Golang中实现RPC异步返回_Golan
- Windows10如何更改桌面背景_Win10个性
- Python解释执行模型_字节码流程说明【指导】
- php修改数据怎么改富文本_update更新htm
- Win10怎么关闭自动更新错误重启 Win10策略
- Linux怎么查找死循环进程_Linux系统负载分
- 如何使用正则表达式提取以编号开头、后跟多个注解的完
- Win11怎么设置默认浏览器Chrome_Wind
- VSC里PHP变量未定义报错怎么解决_错误抑制技巧
- Python爬虫项目实战教程_Scrapy抓取与存

ULL 为什么常调错版本?
QQ客服