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

发布时间 - 2026-01-01 00:00:00    点击率:
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  # 会报  # 替换成  # 头文件  # 隐式  # 才是  # 就不  # 要注意  # 用了  # 不认识  # 不支持 


相关栏目: 【 网站优化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浏览器标签恢复快捷键与方法【指南】  如何撰写建站申请书?关键要点有哪些?  如何将凡科建站内容保存为本地文件?