全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++ nullptr与NULL区别_c++11空指针规范

NULL本质是整数0,重载时优先匹配int参数而非指针;nullptr是std::nullptr_t类型,只向指针隐式转换,确保类型安全。

函数重载时传 NULL 为什么常调错版本?

因为 NULL 本质是宏,C++ 中多数编译器定义为 0int 类型),不是指针。当存在两个重载函数时,编译器优先匹配整数参数——哪怕你本意是传空指针。

  • 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:
      template operator T*() const { return 0; }
      template operator T C::*() const { return 0; }
    private: void operator&() const;
    } nullptr = {};
  • 但强烈不建议在生产环境手写模拟——它无法参与 SFINAE、不支持 decltype(nullptr)、与标准库智能指针交互可能出问题
  • 真正要长期维护的老项目,优先考虑升级工具链;临时兼容可加条件编译:#if __cplusplus >= 201103L 分支处理
C++11 之后,nullptr 不是“可选项”,而是类型安全的底线——它不解决新功能,但堵住了 NULL 留下的所有歧义入口。最易忽略的点是:**连 if (ptr == NULL) 这种看似无害的判断,都可能因宏展开或重载干扰,在复杂模板中引发静默类型退化**。


# 工具  # c++  # 区别  # 标准库  # 隐式转换  # 为什么  # red  # String  # NULL  # define  # if  # while  # Error  # auto  # extern  # char  # int  # void  # 指针  # 重载函数  # 接口  # 指针类型  # 函数重载  # 空指针  # delete  # this  # ide  # 会报  # 替换成  # 头文件  # 隐式  # 才是  # 就不  # 用了  # 要注意  # 不认识  # 不支持 


相关文章: 购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  b2c电商网站制作流程,b2c水平综合的电商平台?  宝塔新建站点为何无法访问?如何排查?  建站之星如何修改网站生成路径?  番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  建设网站制作价格,怎样建立自己的公司网站?  如何用IIS7快速搭建并优化网站站点?  图册素材网站设计制作软件,图册的导出方式有几种?  官网建站费用明细查询_企业建站套餐价格及收费标准指南  如何制作算命网站,怎么注册算命网站?  建站之星客服服务时间及联系方式如何?  如何在Windows环境下新建FTP站点并设置权限?  如何在建站之星绑定自定义域名?  家具网站制作软件,家具厂怎么跑业务?  网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  高端建站三要素:定制模板、企业官网与响应式设计优化  如何通过西部数码建站助手快速创建专业网站?  如何选择PHP开源工具快速搭建网站?  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  如何快速搭建高效WAP手机网站吸引移动用户?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  盐城做公司网站,江苏电子版退休证办理流程?  重庆市网站制作公司,重庆招聘网站哪个好?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  如何设计高效校园网站?  红河网站制作公司,红河事业单位身份证如何上传?  建站之星展会模板:智能建站与自助搭建高效解决方案  如何制作一个表白网站视频,关于勇敢表白的小标题?  C++时间戳转换成日期时间的步骤和示例代码  宿州网站制作公司兴策,安徽省低保查询网站?  建站主机如何选?高性价比方案全解析  网站设计制作公司地址,网站建设比较好的公司都有哪些?  代购小票制作网站有哪些,购物小票的简要说明?  商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  浅析上传头像示例及其注意事项  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  宁波自助建站系统如何快速打造专业企业网站?  大连 网站制作,大连天途有线官网?  建站主机与虚拟主机有何区别?如何选择最优方案?  如何快速搭建支持数据库操作的智能建站平台?  高防服务器如何保障网站安全无虞?  IOS倒计时设置UIButton标题title的抖动问题  制作企业网站建设方案,怎样建设一个公司网站?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  如何挑选优质建站一级代理提升网站排名? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。