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* 隐式转其他指针),所以实际编译器常退化为 0 或 0L。
重载函数调用时避免歧义
当存在多个重载函数,参数分别是 int 和 char*(或任意指针)时,传 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应用性能分析与优化技巧大全

