0

0

c++如何使用std::nullptr_t_c++空指针类型详解【原理】

冰火之心

冰火之心

发布时间:2026-02-17 18:00:39

|

116人浏览过

|

来源于php中文网

原创

std::nullptr_t 是c++11引入的空指针字面量类型,仅具 nullptr 一个值,非整数也非指针,需 std:: 前缀访问,用于消除重载二义性。

c++如何使用std::nullptr_t_c++空指针类型详解【原理】

std::nullptr_t 是什么类型,为什么不能直接写 nullptr_t

std::nullptr_t 是 C++11 引入的**空指针字面量类型**,它只有一种合法值:nullptr。它不是整数类型,也不是指针类型,而是一个独立的、可隐式转换为任意指针类型的空类型。

常见错误是试图这样写:

std::nullptr_t x = nullptr;
——这本身没错;但若写成
nullptr_t x = nullptr;
就会报错,因为 nullptr_t 不在全局作用域,必须带 std:: 前缀(除非你用 using std::nullptr_t;)。

关键点:nullptr 是字面量,std::nullptr_t 是它的类型,二者不可互换使用。

如何用 std::nullptr_t 重载函数区分空指针和整数 0?

老式 NULL(即 00L)导致函数重载二义性,std::nullptr_t 提供了明确的重载分支:

立即学习C++免费学习笔记(深入)”;

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

调用效果:

Yourware
Yourware

专注于AI编程作品部署与分享的云托管平台

下载
  • foo(0) → 调用 int 版本
  • foo(nullptr) → 精确匹配 std::nullptr_t 版本
  • foo(NULL) → 取决于实现(可能为 intchar*),不推荐

这是 std::nullptr_t 最实用的场景:让接口对空指针有显式、无歧义的语义支持。

能否把 std::nullptr_t 当作模板参数或类型别名?

可以,但它非常“单薄”——除了能转成指针,几乎不能做任何事:

  • 不能取地址:&nullptr 是非法的
  • 不能定义数组:std::nullptr_t arr[3] 编译失败
  • 可以作为模板参数:
    template<typename T> struct holder { T val; }; holder<std::nullptr_t> h{nullptr};
  • 可以 typedef / using:
    using null_type = std::nullptr_t;
    ,但意义有限,因为无法构造其他值

它本质上是个“标记类型”,设计目的就是唯一、轻量、可转换,不是为了承载数据。

为什么 sizeof(std::nullptr_t) 通常是 1,且不能继承?

std::nullptr_t 是个空类类型(empty class type),标准只要求它满足“可隐式转换为任意指针类型”,未规定大小,但主流实现(GCC、Clang、MSVC)都设为 1 字节,以满足对象必须有唯一地址的要求。

它不可派生:

struct bad : std::nullptr_t {};
会编译失败,因为标准明确禁止继承 std::nullptr_t(它是 final 类型,尽管未显式写 final,但语言规则限制其不可继承)。

这点容易被忽略:它不是普通类,而是语言内建的特殊类型,行为由标准硬性约束,而非实现自由发挥。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

244

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

746

2024.03.01

typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

116

2023.09.26

c语言typedef的用法
c语言typedef的用法

c语言typedef的用法有定义基本类型别名、定义结构体别名、定义指针类型别名、定义枚举类型别名、定义数组类型别名等。本专题为大家提供typedef相关的文章、下载、课程内容,供大家免费下载体验。

102

2023.09.26

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

750

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

572

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

234

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

210

2025.08.29

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

462

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9.6万人学习

C 教程
C 教程

共75课时 | 4.8万人学习

C++教程
C++教程

共115课时 | 18.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号