c++ nullptr与NULL区别_c++11空指针规范
技术百科
穿越時空
发布时间:2026-01-01
浏览: 次 NULL本质是整数0,重载时优先匹配int参数而非指针;nullptr是std::nullptr_t类型,只向指针隐式转换,确保类型安全。
函数重载时传 N
ULL 为什么常调错版本?
因为 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 = 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: 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) 这种看似无害的判断,都可能因宏展开或重载干扰,在复杂模板中引发静默类型退化**。
# 才是
# 用了
# 要注意
# 就不
# 不支持
# 工具
# auto
# Error
# c++
# 隐式转换
# String
# if
# int
# void
# 函数重载
# 区别
# 标准库
# 指针
# 接口
# 为什么
# red
# this
# delete
# NULL
# define
# 头文件
# while
# extern
# 指针类型
# 隐式
# char
# 空指针
# 会报
# ide
# 不认识
# 重载函数
# 替换成
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Python迭代器生成器进阶教程_节省内存与懒加载
- Mac电脑如何恢复出厂设置_Mac抹掉数据并重装系
- Go 语言标准库为何不提供泛型 Contains
- Mac的“预览”如何合并多个PDF_Mac文件处理
- Win11怎么查看电脑配置_Win11硬件配置详细
- Win11如何更改任务栏颜色 Win11自定义任务
- c++20的std::format怎么用 比pri
- Windows服务持续崩溃怎样修复_系统服务保护机
- MAC怎么在照片中添加水印_MAC自带编辑工具文字
- MAC如何设置网卡MAC地址克隆_MAC终端修改物
- c++如何使用std::bitset进行位图算法_
- C#如何在一个XML文件中查找并替换文本内容
- ACF 教程:正确更新嵌套在多层 Group 字段
- VSC怎么在PHP中调试MySQL_数据库交互排查
- Mac怎么查看活动监视器_理解Mac进程和资源占用
- PHP主流架构如何处理会话管理_Session与C
- Win11如何更新显卡驱动 Win11检查和安装设
- 如何使用Golang template生成文本模板
- c++如何实现多态性_c++ 虚函数表原理与动态绑
- Win11怎么设置按流量计费_Win11限制后台流
- Windows音频驱动无声音原因解析_声卡驱动错误
- 如何在Golang中实现服务熔断与限流_Golan
- 如何处理“XML格式不正确”错误 常见XML we
- Win11怎么禁用键盘自带键盘_Win11笔记本禁
- 如何在 Go 中高效缓存与分发网络视频流
- Mac怎么设置登录项_Mac管理开机自启动程序【教
- Win11如何设置自动关机 Win11定时关机命令
- Win11怎么设置任务栏透明_Windows11使
- 如何在 Go 开发中正确处理本地包导入与远程模块路
- Win10 BitLocker加密教程 Win10
- VSC怎样在Linux运行PHP_Ubuntu系统
- 如何使用Golang recover捕获panic
- 如何在JavaScript中动态拼接PHP的bas
- PHP接收参数值为空怎么办_判断和处理空参数方法说
- 如何诊断并终止卡死的 multiprocessin
- 如何在 Django 中修改用户密码后保持会话不丢
- Win11怎么激活Windows10_Win11激
- 如何在Golang中处理通道发送接收错误_防止阻塞
- c++ try_emplace用法_c++ map
- c++中的CRTP是什么 c++奇异递归模板模式【
- php删除数据怎么清空表_truncate与del
- PowerShell怎么创建复杂的XML结构
- Python数据抓取合法性_合规说明【指导】
- 如何在Golang中解压文件_Golang com
- 如何使用Golang匿名函数_快速定义临时函数逻辑
- Win11怎么更改电脑密码_Windows 11修
- Win11怎么设置默认邮件应用_Windows11
- 如何在Golang中修改数组元素_通过指针实现原地
- php8.4xdebug无法调试怎么办_php8.
- 如何在Golang中处理模块包路径变化_Golan

ULL 为什么常调错版本?
QQ客服