C++里的nullptr为什么比NULL更安全?(强类型检查防止重载歧义)

发布时间 - 2026-01-09 00:00:00    点击率:
nullptr 是类型安全的空指针字面量,只能隐式转换为指针类型而不会转为整数;NULL 是宏(常为0),在重载函数中易引发歧义匹配。

nullptr 是类型安全的空指针字面量

nullptr 在 C++11 中被引入,本质是 std::nullptr_t 类型的纯右值,只能隐式转换为任意指针类型(包括成员指针),但**不会转换为整数类型**。而 NULL 通常是宏定义,比如 #define NULL 0#define NULL ((void*)0) —— 前者是 int,后者在 C++ 中不合法(C++ 禁止 void* 隐式转其他指针),所以实际编译器常退化为 00L

重载函数调用时避免歧义

当存在多个重载函数,参数分别是 intchar*(或任意指针)时,传 NULL 可能意外匹配 int 版本:

void foo(int) { std::cout << "int\n"; }
void foo(char*) { std::cout << "char*\n"; }

foo(NULL); // 输出 "int"(取决于 NULL 定义,但常见行为) foo(nullptr); // 编译错误?不,它只匹配 char → 输出 "char"(唯一可行转换)

这是因为 nullptr 不能转成 int,而 NULL(若为 0)是 int,优先匹配 int 重载。

模板推导和 auto 推导更可靠

NULL 初始化模板参数或 auto 变量,类型可能不是你想要的:

  • auto p = NULL;p 类型是 int(不是指针!)
  • auto p = nullptr;p 类型是 std::nullptr_t,后续赋值给任何指针都合法
  • 模板函数如 template void bar(T*); bar(NULL);T 推导失败(NULL 不是指针类型),而 bar(nullptr) 可正确推导出 T

与 sizeof、函数指针等场景的兼容性

nullptr 的大小始终与指针一致(sizeof(nullptr) == sizeof(void*)),且可直接赋值给函数指针:

void func() {}
void (*fp)() = nullptr;  // 合法
// void (*fp)() = NULL;   // 若 NULL 是 0,则 error:cannot convert 'int' to 'void (*)()' 

某些平台对 NULL 宏的实现不统一,尤其跨编译器或混用 C/C++ 头文件时,nullptr 彻底规避了宏展开和整数/指针二义性问题。

真正容易被忽略的是:即使项目已全面使用 nullptr,第三方 C 头文件里仍可能带 NULL 宏;若你在 C++ 中写 if (p == NULL),虽能编译,但已失去类型安全优势——这种写法应一律改为 p == nullptr 或更推荐的 !p


# c++  # 隐式转换  # 为什么  # NULL  # define  # if  # auto  # char  # int  # void  # 指针  # 重载函数  # 指针类型  # 整数类型  # 空指针  # 转换为  # 隐式  # 的是  # 头文件  # 多个  # 能带  # 可直接  # 第三方  # 这是因为  # 中不 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  清除minerd进程的简单方法  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  如何用PHP快速搭建CMS系统?  如何在企业微信快速生成手机电脑官网?  如何批量查询域名的建站时间记录?  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  如何快速辨别茅台真假?关键步骤解析  如何用PHP工具快速搭建高效网站?  如何在IIS中新建站点并解决端口绑定冲突?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  北京企业网站设计制作公司,北京铁路集团官方网站?  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  微信小程序 HTTPS报错整理常见问题及解决方案  C#如何调用原生C++ COM对象详解  微信小程序 require机制详解及实例代码  如何在阿里云通过域名搭建网站?  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  Laravel怎么清理缓存_Laravel optimize clear命令详解  Laravel如何使用Service Container和依赖注入?(代码示例)  历史网站制作软件,华为如何找回被删除的网站?  如何在阿里云高效完成企业建站全流程?  敲碗10年!Mac系列传将迎来「触控与联网」双革新  Laravel怎么为数据库表字段添加索引以优化查询  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  中山网站推广排名,中山信息港登录入口?  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  浅谈redis在项目中的应用  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  用v-html解决Vue.js渲染中html标签不被解析的问题  使用Dockerfile构建java web环境  Android滚轮选择时间控件使用详解  WordPress 子目录安装中正确处理脚本路径的完整指南  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  网站页面设计需要考虑到这些问题  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  高性能网站服务器部署指南:稳定运行与安全配置优化方案  Linux网络带宽限制_tc配置实践解析【教程】  浅谈javascript alert和confirm的美化  b2c电商网站制作流程,b2c水平综合的电商平台?  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  图册素材网站设计制作软件,图册的导出方式有几种?  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全