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怎么关闭透明效果_Windows11辅助
- Windows10怎样连接蓝牙设备_Windows
- Win11如何更改用户账户文件夹名称 Win11修
- 如何在包含多值的列中精准搜索指定演员?
- 微信短链接怎么还原php_用浏览器开发者工具抓包获
- Win11文件扩展名怎么显示 Win11查看文件后
- php打包exe怎么传递参数_命令行参数接收方法【
- ACF 教程:正确更新嵌套在多层 Group 字段
- php嵌入式多设备通信怎么实现_php同时管理多个
- 如何在Golang中实现服务熔断与限流_Golan
- windows系统找不到无线网络怎么办_windo
- Win10怎么关闭自动更新错误弹窗_Win10策略
- 如何用正则表达式精确匹配“start”到“end”
- Win10任务栏天气和资讯怎么关闭 Win10禁用
- Win11怎么清理C盘OneDrive缓存_Win
- Win11怎么禁用键盘自带键盘_Win11笔记本禁
- Windows蓝屏BAD_POOL_HEADER故
- 如何在Golang中指定模块版本_使用go.mod
- Win11怎么开启自动HDR画质_Windows1
- c++ stringstream用法详解_c++字
- Mac电脑进水了怎么办_MacBook进水后紧急处
- Windows如何使用BitLocker To G
- Win10怎样清理C盘爱奇艺缓存_Win10清理爱
- MAC如何设置网卡MAC地址克隆_MAC终端修改物
- Win11怎么设置默认邮件应用_Windows11
- Go 中 := 短变量声明的类型推导机制详解
- 如何在Golang中捕获结构体方法错误_Golan
- Windows家庭版如何开启组策略(gpedit.
- php做exe支持多线程吗_并发处理实现方式【详解
- Mac的Time Machine怎么用_Mac系统
- Python函数参数高级用法_默认值与可变参数解析
- Win11 C盘满了怎么清理 Win11磁盘清理和
- c++ atoi和atof函数用法_c++字符数组
- Win11怎样安装网易云音乐_Win11安装网易云
- Win11怎么忘记WiFi网络_Win11删除已保
- C++友元类使用场景_C++类间协作设计方式讲解
- php删除数据怎么软删除_添加is_del字段标记
- 手机php文件怎么变成mp4_安卓苹果打开php转
- Mac如何查看电池健康百分比_Mac系统信息电源检
- php怎么下载安装后无法解析php文件_服务器配置
- Go 中 defer 在 goroutine 内部
- Win11怎么查看电脑配置_Win11硬件配置详细
- 如何在Golang中使用encoding/gob序
- Win10怎么创建桌面快捷方式 Win10为应用创
- windows如何修改文件默认打开方式_windo
- mac怎么看硬盘大小_MAC查看磁盘存储空间与文件
- 如何快速验证Golang安装是否成功_运行go v
- php怎么下载安装后测试是否成功_简单脚本验证方法
- php能跑在stm32上吗_php在stm32微控
- c# 如何深拷贝和浅拷贝

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