c++ nullptr与NULL区别_c++11空指针规范
发布时间 - 2026-01-01 00:00:00 点击率:次NULL本质是整数0,重载时优先匹配int参数而非指针;nullptr是std::nullptr_t类型,只向指针隐式转换,确保类型安全。
函数重载时传 NULL 为什么常调错版本?
因为 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 = null,但需确认所有使用该宏的指针类型兼容
ptr - 检查构建日志:替换后若出现
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) 这种看似无害的判断,都可能因宏展开或重载干扰,在复杂模板中引发静默类型退化**。
# 工具
# c++
# 区别
# 标准库
# 隐式转换
# 为什么
# red
# String
# NULL
# define
# if
# while
# Error
# auto
# extern
# char
# int
# void
# 指针
# 重载函数
# 接口
# 指针类型
# 函数重载
# 空指针
# delete
# this
# ide
# 会报
# 替换成
# 头文件
# 隐式
# 才是
# 就不
# 要注意
# 用了
# 不认识
# 不支持
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在万网开始建站?分步指南解析
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
如何在搬瓦工VPS快速搭建网站?
深圳网站制作的公司有哪些,dido官方网站?
Swift中switch语句区间和元组模式匹配
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层
Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
BootStrap整体框架之基础布局组件
WordPress 子目录安装中正确处理脚本路径的完整指南
如何在橙子建站上传落地页?操作指南详解
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
iOS中将个别页面强制横屏其他页面竖屏
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
Laravel安装步骤详细教程_Laravel环境搭建指南
Laravel如何使用withoutEvents方法临时禁用模型事件
如何在腾讯云服务器上快速搭建个人网站?
Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
网站制作软件有哪些,制图软件有哪些?
如何基于云服务器快速搭建网站及云盘系统?
Laravel怎么使用Intervention Image库处理图片上传和缩放
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
Android自定义listview布局实现上拉加载下拉刷新功能
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
如何构建满足综合性能需求的优质建站方案?
微信小程序 闭包写法详细介绍
无锡营销型网站制作公司,无锡网选车牌流程?
Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】
如何快速搭建FTP站点实现文件共享?
如何快速生成可下载的建站源码工具?
如何在阿里云部署织梦网站?
个人网站制作流程图片大全,个人网站如何注销?
HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
Laravel如何处理CORS跨域请求?(配置示例)
如何登录建站主机?访问步骤全解析
如何用虚拟主机快速搭建网站?详细步骤解析
如何快速搭建安全的FTP站点?
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】
活动邀请函制作网站有哪些,活动邀请函文案?
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
在Oracle关闭情况下如何修改spfile的参数
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
如何撰写建站申请书?关键要点有哪些?
如何将凡科建站内容保存为本地文件?


ptr