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; ?>
】
相关推荐
- Win11如何卸载OneDrive_Win11卸载
- WindowsUSB驱动安装异常怎么办_USB驱动
- MySQL 中使用 IF 和 CASE 实现查询字
- Win11怎样激活系统密钥_Win11系统密钥激活
- 获取 PHP 文件最后修改时间的正确方法
- 本地php环境打开php文件直接下载_浏览器解析p
- MAC如何隐藏文件夹及文件_MAC终端命令隐藏与第
- Windows10如何删除Windows.old_
- Python文件和流处理指南_高效读写大体积数据文
- php怎么捕获异常_trycatch结构处理运行时
- Win11怎么关闭自动更新 Win11永久关闭系统
- 如何关闭Win10自动更新更新_Win10系统自动
- Win11怎么连接投影仪_Win11多显示器投屏设
- Python装饰器复用技巧_通用能力解析【教程】
- Win11用户账户控制怎么关_Win11关闭UAC
- Windows怎样关闭桌面弹窗广告_Windows
- Win11怎么设置环境变量_Win11配置Path
- 如何使用Golang defer优化性能_减少不必
- Win11怎么设置夜间模式_Windows11显示
- php订单日志怎么记录评价_php记录订单评价日志
- Win11怎么开启剪贴板历史记录_Windows1
- Win11 explorer.exe频繁崩溃_修复
- Windows10任务栏图标变成白色文件_Win1
- Windows10如何删除恢复分区_Win10 D
- PythonPandas数据分析教程_数据清洗与处
- php能控制zigbee模块吗_php通过串口与c
- 企业SEO优化选择网站建设模板的技巧
- php文件怎么变mp4保存_php输出视频流保存为
- PHP主流架构怎么处理表单验证_规则与自定义【技巧
- Win11玩游戏全屏闪退怎么办_Win11全屏优化
- Win11开机速度慢怎么优化_Win11系统启动加
- 如何在Golang中捕获JSON序列化错误_Gol
- 如何在Golang中实现微服务服务拆分_Golan
- Win11怎么查看已连接wifi密码 Win11查
- Win11任务栏颜色怎么改_Win11自定义任务栏
- c++ namespace命名空间用法_c++避免
- php485在macos下怎么配置_php485
- 手机php怎么转mp4_手机端php文件转mp4a
- Win10电脑怎么设置IP地址_Windows10
- mac怎么打开终端_MAC终端Terminal使用
- Python多进程教程_multiprocessi
- Win11时间怎么同步到原子钟 Win11高精度时
- Win11怎么关闭自动维护 Win11禁用系统自动
- 如何在 Laravel 中通过嵌套关联关系进行 o
- Win10怎样卸载iTunes_Win10卸载iT
- c++中的Tag Dispatching是什么_c
- 如何使用Golang处理网络超时错误_Golang
- 作用域操作符会影响性能吗_php静态调用性能分析【
- php怎么下载安装后测试是否成功_简单脚本验证方法
- 如何使用正则表达式批量替换重复的星号-短横模式为固

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