C++ nullptr是什么类型 C++ std::nullptr_t类型解析【新特性】

发布时间 - 2026-01-25 00:00:00    点击率:
nullptr 是 C++11 引入的空指针字面量,类型为 std::nullptr_t;它仅可隐式转换为任意指针类型,不支持算术运算或转为整数,且在函数重载中能精准匹配指针参数,避免 NULL 或 0 引

发的二义性。

nullptr 不是类型,它是一个字面量(literal),其类型是 std::nullptr_t。这是 C++11 引入的关键改进,用来替代容易引发二义性的 NULL(本质是 0void*)和整数字面量 0

为什么不能把 nullptr 当作 void* 或整数用

常见错误是试图对 nullptr 做算术运算或隐式转成整数:

int x = nullptr;          // 错误:no viable conversion
int y = nullptr + 1;      // 错误:invalid operands to binary expression
void* p = nullptr + 4;    // 错误:cannot add to 'std::nullptr_t'

std::nullptr_t 是一个空类类型(empty class type),只定义了到所有指针类型的隐式转换,不支持任何其他运算。它的设计目标非常明确:只用于表示空指针值,不参与计算。

std::nullptr_t 在函数重载中的关键作用

当多个重载函数分别接受 intconst char* 和指针时,nullptr 能精准匹配指针版本,而 0NULL 可能触发非预期的整数重载:

void foo(int)     { std::cout << "int\n"; }
void foo(char*)   { std::cout << "char*\n"; }
void foo(void*)   { std::cout << "void*\n"; }

foo(0); // 调用 foo(int),不是你想要的 foo(nullptr); // 明确调用 foo(void*)

这种行为差异在模板推导中更明显:template void bar(T) 接收 nullptr 时,T 被推导为 std::nullptr_t,而非 intvoid*

std::nullptr_t 的底层定义与兼容性细节

标准规定 std::nullptr_t 是一个独立的、不可实例化的类型,通常实现为:

namespace std {
  typedef decltype(nullptr) nullptr_t;
}

实际使用中需注意:

  • sizeof(std::nullptr_t) 通常是 1(空类),但标准未强制要求
  • 不能定义 std::nullptr_t 的变量并赋值(如 std::nullptr_t n = nullptr; 合法,但 n = nullptr 之后不能再赋其他值——因为没定义赋值操作符)
  • 不能继承 std::nullptr_t,它是 final-like(无用户定义构造/析构/赋值)
  • C++11 起支持,旧代码若需兼容 C++98,仍需避免直接依赖该类型

真正容易被忽略的是:即使你从不显式写 std::nullptr_t,只要用了 nullptr,编译器就在背后依赖这个类型做类型安全检查——它不像宏替换那样透明,而是深度融入类型系统。一旦涉及模板元编程或 SFINAE,std::nullptr_t 的存在就立刻变得不可绕过。


# c++  # 隐式转换  # 为什么  # NULL  # const  # char  # int  # void  # 指针  # 继承  # 重载函数  # class  # 指针类型  # 函数重载  # 空指针  # 是一个  # 它是  # 不支持  # 隐式  # 的是  # 这是  # 就在  # 多个  # 用了  # 不像 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  如何做网站制作流程,*游戏网站怎么搭建?  如何用西部建站助手快速创建专业网站?  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  如何为不同团队 ID 动态生成多个独立按钮  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  如何在阿里云香港服务器快速搭建网站?  如何有效防御Web建站篡改攻击?  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  如何在建站之星网店版论坛获取技术支持?  如何快速生成可下载的建站源码工具?  Laravel怎么在Controller之外的地方验证数据  如何在局域网内绑定自建网站域名?  php 三元运算符实例详细介绍  大学网站设计制作软件有哪些,如何将网站制作成自己app?  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  企业网站制作这些问题要关注  Python文件流缓冲机制_IO性能解析【教程】  香港网站服务器数量如何影响SEO优化效果?  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  如何在建站宝盒中设置产品搜索功能?  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  javascript基本数据类型及类型检测常用方法小结  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  如何用好域名打造高点击率的自主建站?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  Laravel Fortify是什么,和Jetstream有什么关系  长沙做网站要多少钱,长沙国安网络怎么样?  网站制作软件有哪些,制图软件有哪些?  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  利用python获取某年中每个月的第一天和最后一天  专业商城网站制作公司有哪些,pi商城官网是哪个?  怎样使用JSON进行数据交换_它有什么限制  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  香港服务器选型指南:免备案配置与高效建站方案解析  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】