c++ nullptr与NULL区别_c++11空指针规范


NULL本质是整数0,重载时优先匹配int参数而非指针;nullptr是std::nullptr_t类型,只向指针隐式转换,确保类型安全。

函数重载时传 NULL 为什么常调错版本?

因为 NULL 本质是宏,C++ 中多数编译器定义为 0int 类型),不是指针。当存在两个重载函数时,编译器优先匹配整数参数——哪怕你本意是传空指针。

  • 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:
      template operator T*() const { return 0; }
      template operator T C::*() const { return 0; }
    private: void operator&() const;
    } nullptr = {};
  • 但强烈不建议在生产环境手写模拟——它无法参与 SFINAE、不支持 decltype(nullptr)、与标准库智能指针交互可能出问题
  • 真正要长期维护的老项目,优先考虑升级工具链;临时兼容可加条件编译:#if __cplusplus >= 201103L 分支处理
C++11 之后,nullptr 不是“可选项”,而是类型安全的底线——它不解决新功能,但堵住了 NULL 留下的所有歧义入口。最易忽略的点是:**连 if (ptr == NULL) 这种看似无害的判断,都可能因宏展开或重载干扰,在复杂模板中引发静默类型退化**。


# 工具  # c++  # 区别  # 标准库  # 隐式转换  # 为什么  # red  # String  # NULL  # define  # if  # while  # Error  # auto  # extern  # char  # int  # void  # 指针  # 重载函数  # 接口  # 指针类型  # 函数重载  # 空指针  # delete  # this  # ide  # 会报  # 替换成  # 头文件  # 隐式  # 才是  # 就不  # 要注意  # 用了  # 不认识  # 不支持 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  mac怎么分屏_MAC双屏显示与分屏操作技巧【指南】  Windows10系统怎么查看防火墙状态_Win10安全中心网络保护  Linux如何使用Curl发送请求_Linux下API接口测试与文件下载技巧【步骤】  Win11怎么设置触控板手势_Windows11三指四指操作自定义  Win11怎么用设置清理回收站_Win11设置清理回收站技巧【步骤】  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  Win11怎么关闭系统透明度_Windows11个性化颜色透明效果  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  Win11如何设置鼠标灵敏度_Win11鼠标灵敏度调整教程【攻略】  Win11怎么关闭搜索历史 Win11清除搜索框最近记录【隐私】  Python文件操作优化_大文件与流处理解析【教程】  如何在Golang中编写异步函数测试_Golang异步操作测试策略  Windows11怎么自定义任务栏_Windows11任务栏自定义教程【步骤】  c# Task.ConfigureAwait(true) 在什么场景下是必须的  php条件判断怎么写_ifelse和switchcase的使用区别【对比】  Python与GPU加速技术_CUDA与Numba高性能计算实践  Python包结构设计_大型项目组织解析【指导】  Win11怎么更改电脑名称_Windows 11修改计算机名操作指南【步骤】  Win11怎么查看wifi信号强度_检测Windows 11无线网络质量方法【详解】  如何在Golang中优化文件读写性能_使用缓冲和并发处理  c++怎么使用std::unique实现去重_c++ 容器元素排序与连续重复删除【教程】  Win11怎么清理C盘OneDrive缓存_Win11清理OneDrive缓存技巧【方法】  php做exe支持多线程吗_并发处理实现方式【详解】  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  Win10怎么创建桌面快捷方式 Win10为应用创建快捷方式【步骤】  Windows10任务栏图标变成白色文件_Win10重建图标缓存修复方法  Win11怎么查看显卡显存_查询Win11显卡详细参数方法【步骤】  php增删改查需要哪些扩展_开启mysqli或pdo扩展方法【说明】  Win11怎么更改鼠标指针_Windows 11自定义鼠标样式与大小【美化】  Python函数缓存机制_lru_cache解析【指导】  c++中如何使用auto关键字_c++11类型推导用法说明  Windows10电脑怎么设置电源按钮_Win10按电源键关机或休眠  c++ namespace命名空间用法_c++避免命名冲突  Win11怎样彻底卸载自带应用_Win11彻底卸载自带应用方法【步骤】  Mac的Time Machine怎么用_Mac系统备份与数据恢复【完整指南】  Python生成器表达式内存优化_惰性计算说明【指导】  如何使用Golang开发基础文件下载功能_Golang HTTP文件响应与缓存实现  Win11怎么设置默认视频播放器_Windows 11关联媒体文件打开方式【步骤】  Win10系统更新错误0x80240034怎么办 Win10更新错误解决法【方法】  如何在 Pandas 中按元素交集合并两列字符串  如何使用Golang实现微服务事件驱动_使用消息总线解耦服务  Win11怎样安装网易云音乐_Win11安装网易云教程【步骤】  如何使用Golang实现云原生应用弹性伸缩_自动应对流量变化  如何使用Golang实现容器健康检查_监控和自动重启  php串口通信波特率怎么选_根据硬件手册设置正确波特率【方法】  Python网页解析流程_html结构说明【指导】  如何在JavaScript中动态拼接PHP的base_url与前端变量  Win10如何更改开机密码_Windows10登录选项更改密码  Win11怎么关闭自动维护 Win11禁用系统自动维护功能【优化】 

 2026-01-01

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.