0

0

C++中的std::monostate是什么?(如何让variant支持默认构造)

尼克

尼克

发布时间:2026-02-16 16:29:40

|

122人浏览过

|

来源于php中文网

原创

std::monostate 是专为 std::variant 设计的空类型,大小为1字节,使 variant 能默认构造;它不携带数据、不可赋值、所有实例相等,仅作合法默认状态占位符,需置于模板参数首位以确保 index() 为0。

c++中的std::monostate是什么?(如何让variant支持默认构造)

std::monostate 是什么,为什么 variant 需要它

std::monostate 是一个空的、无状态的类型,专为 std::variant 设计。它本身不携带任何数据,大小为 1 字节(满足 trivial 类型要求),且默认可构造、可复制、可比较。它的唯一作用是:让 std::variant 在没有显式指定初始值时,能有一个合法的默认构造状态。

比如 std::variant<int std::string></int> 无法默认构造——编译器不知道该初始化成 int{} 还是 std::string{}。但加上 std::monostatestd::variant<:monostate int std::string></:monostate>,就天然支持 variant<...> v;</...>,此时 v.index() 为 0,即持有 std::monostate

怎么用 std::monostate 让 variant 默认构造

std::monostate 放在 std::variant 模板参数列表最前面(推荐),然后直接定义变量:

std::variant<std::monostate, int, std::string> v; // ✅ 默认构造成功

常见错误写法:

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

Grammarly
Grammarly

Grammarly是一款在线语法纠正和校对工具,伟大的AI辅助写作工具

下载
  • 漏掉 std::monostate,直接写 std::variant<int std::string> v;</int> → 编译失败,报错类似 error: call to implicitly-deleted default constructor
  • std::monostate 放在中间或末尾,比如 std::variant<int std::monostate std::string></int> → 虽然语法合法,但 v.index() 默认是 1(对应 std::monostate),容易让人误以为“第二个类型才是默认”,可读性差,不推荐
  • 试图用 std::in_place_index 显式构造却忘了加 std::monostate → 依然编译不过,因为模板参数里根本没它

std::monostate 的行为和注意事项

std::monostate 不可赋值、不可比较(除 ==!= 外)、不参与 std::get 提取(std::get<:monostate>(v)</:monostate> 合法但返回临时对象,几乎无用)。它只是一个“占位符”。

关键点:

  • 它不增加 std::variant 的内存开销(sizeof(std::monostate) == 1,而 variant 的 size 已由最大成员+对齐决定)
  • 所有 std::monostate 实例都相等:std::monostate{} == std::monostate{} 返回 true
  • 不能对它调用 std::get_if<:monostate>(&v)</:monostate> 来判断是否为空——应该用 v.index() == 0 或封装一个 is_empty() 辅助函数
  • 它不是“空值”语义的替代品(比如不像 std::optional 那样表示“未设置”),只是让 variant 能默认构造的机制手段

替代方案对比:optional vs monostate

有人会想:既然要“可空”,为什么不直接用 std::optional<:variant std::string>></:variant>

区别很实际:

  • std::optional<variant>></variant> 多一层嵌套,sizeof 至少多 1 字节(存储 has_value),访问需两层解包:opt->index()
  • variant<monostate ...></monostate> 更扁平,内存布局更紧凑,且 index() 直接反映当前状态,适合需要频繁判别类型的场景
  • std::monostate 无法表达“从有值变回无值”的意图(比如你希望清空一个已含 int 的 variant);这时得手动赋值:v = std::monostate{};

真正容易被忽略的是:一旦用了 std::monostate,所有 std::visit 的 visitor 都必须处理这个分支——哪怕你只把它当默认构造占位符,漏掉 [](const std::monostate&) {} 就会导致编译失败。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
string转int
string转int

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

750

2023.08.02

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

351

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

339

2023.10.25

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

547

2023.09.20

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是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

568

2024.08.29

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

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

234

2025.08.29

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

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

209

2025.08.29

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

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

145

2026.02.13

热门下载

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

精品课程

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

共94课时 | 9.6万人学习

C 教程
C 教程

共75课时 | 4.8万人学习

C++教程
C++教程

共115课时 | 18万人学习

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

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