C++20 升 C++23 迁移清单:开关、破坏性改动与收益

AI资讯简报的工程化实践:深度筛选与生产就绪指南 AI资讯简报是面向开发者的技术情报载体,其核心在于从海量信息中实现高精度筛选与可验证落地。它基于实测数据、版本可控、模块化结构(如核心突破、工具链演进、生产信号、避坑日志)构建低决策成本的信息系统,强调非营销化表达、代价同步披露与环境可复现性。技术价值体现在缩短AI技术评估周期、降低生产环境试错成本、支撑CTO/工程师快速做技术选型。典型应用场景包括LLM推理优化、LangChain等工具链升级、RAG性能调优及Ollama本地部署排障。本文以#96期为样本,解析一套真正‘生产就绪’的AI简报设计逻辑与个人 阅读详情

C++23 是继 C++20 之后的小版本,它没有 C++20 引入 Concepts / ranges / 协程那种「天翻地覆」,而是把一堆高频手写模式收进标准库。所以「要不要升」的答案通常是:值得升,而且风险低——真正的坑不在语言,而在编译器版本。这篇按「开关 → 破坏性改动 → 收益 → 实操」的顺序,给一份能照着做的迁移清单。

1. 引子:先确认编译器跟得上

C++23 的可用性主要由编译器版本决定,而不是「写不写得出新语法」。gcc 到 14、clang 到 17 才算基本完整;更早的版本要么用实验性开关(-std=c++2b),要么干脆缺库。

编译器正式开关实验开关C++23 基本完整
GCC-std=c++23-std=c++2b(GCC 11–13)GCC 14+
Clang-std=c++23-std=c++2b(Clang 16 及以前)Clang 17+
MSVC/std:c++latest—VS 2022 17.x

一个真实的坑:gcc 13 在 -std=c++23 下,__cplusplus 宏仍是 202100L(GCC 14 才改成 202302L)。所以用 __cplusplus >= 202302L 判断「现在是不是 C++23」在 gcc 13 上会误判。规避办法是用 feature-test 宏(__cpp_lib_*)而不是 __cplusplus。下面这段把两者都打印出来对照:

// verify: std=c++23
#include <expected>
#include <optional>
#include <print>

int main() {
    std::println("__cplusplus = {}", __cplusplus);
    std::println("__cpp_lib_expected = {}", __cpp_lib_expected);
    std::println("__cpp_lib_optional = {}", __cpp_lib_optional);
}
__cplusplus = 202302
__cpp_lib_expected = 202211
__cpp_lib_optional = 202110

__cpp_lib_expected = 202211 表示「std::expected 已可用」,比 __cplusplus 更精准地对应到「某个具体库特性在不在」。写可移植代码时,判特性用 __cpp_lib_*,判语言标准才用 __cplusplus。

官方文档:Feature test macros — cppreference:__cpp_* / __cpp_lib_* 的完整对照表,迁移时按需查。

2. 破坏性改动:几乎可以忽略

C++20 → C++23 的破坏性改动非常少,绝大多数现有 C++20 代码原样重编就能过。需要留意的只有几处「废弃 → 将来移除」类的内容:

改动类型影响应对
std::aligned_storage废弃(deprecated)用它的代码在 -Wall 下会收警告换成 alignas + std::byte 数组
std::aligned_union废弃同上换成 std::aligned_union 的替代或 alignas
个别 constexpr 能力收紧/修正行为修正极小遇到再看具体报错
volatile 复合赋值等被废弃废弃老代码可能警告移除不必要的 volatile

结论:语言层面基本无痛,真正的迁移成本在「要不要顺手把老写法换成 C++23 的新写法」,而不是「能不能编过」。

为什么破坏性改动这么少?这是 C++ 标准委员会近年的既定策略:新标准以「新增」为主,删除或改动既有行为要经过漫长的废弃期,尽量不打断现有代码库。所以对已经在 C++20 上稳定运行的项目来说,这次迁移的风险主要来自编译器本身的实现差异(比如 gcc 13 的 __cplusplus 老行为),而不是语言规则变了导致代码语义改变。

3. 收益清单:哪些值得第一时间替换

升到 C++23 不意味着要重写代码,但下面这几项是「零风险、纯正收益」的替换,值得一升就做。

C++23 新特性替代谁收益
std::expected<T,E>错误码 / 哨兵值 / 返回 pair<bool,T>错误显式进类型,不靠约定
std::print / std::printlnstd::cout + 一堆 <<类型安全、格式集中、无 endl 刷缓冲坑
monadic optional(and_then/transform/or_else)一串 if (opt) {...}判空链式化,少嵌套
std::ranges::to<Container>()手写 vector(v.begin(), v.end())ranges 结果直接落容器

替换的优先级原则很简单:先换「零行为差异、纯语法简化」的,再换「行为有细微差别、需要验证」的。std::print 和 monadic optional 属于前者:它们只是把原来的写法变短,语义一模一样,替换后跑一遍测试就能确认无差异。std::expected 属于后者。它要求你把错误处理从「返回错误码 + 传引用返回结果」改成「返回 expected 对象」,涉及函数签名的改动,要连调用方一起改,适合新模块优先、老模块渐进。

先看 std::print 的替换:同样的输出,老写法要把格式和变量搅在一串 << 里。

// verify: std=c++23
#include <print>
#include <iostream>
#include <string>

int main() {
    std::string name = "喵喵";
    int score = 95;

    // C++20 老写法:格式和变量混在 << 里
    std::cout << name << " 考了 " << score << " 分\n";

    // C++23 新写法:一个格式串,变量后置
    std::println("{} 考了 {} 分", name, score);
}
喵喵 考了 95 分
喵喵 考了 95 分

官方文档:std::print — cppreference:格式串语法与 std::format 同源。

再看判空的替换,这是「迁移清单」里收益最直观的一条——一个「字符串转整数再翻倍」的流程,C++20 要写 if,C++23 一条链搞定:

// verify: std=c++23
#include <optional>
#include <string>
#include <print>

std::optional<int> toInt(const std::string& s) {
    try { return std::stoi(s); } catch (...) { return std::nullopt; }
}

int main() {
    std::string input = "42";

    // C++20 老写法:if 判空
    int old = 0;
    auto r = toInt(input);
    if (r.has_value()) old = *r * 2;

    // C++23 新写法:monadic 链
    int now = toInt(input).transform([](int x){ return x * 2; }).value_or(0);

    std::println("old={} now={}", old, now);
}
old=84 now=84

官方文档:std::optional::and_then — cppreference:transform / or_else 在同一页可以跳到。

4. 迁移实操:分三步走

不建议一次性把整个工程切成 C++23 再改写法。更稳的节奏是「开关先行、兼容过渡、按需替换」。

   第 1 步 改编译开关        -std=c++20  ->  -std=c++23
             │                (CI 里单独开一条 lane 验证)
             ▼
   第 2 步 兼容期共存        feature-test 宏 + #if 做条件编译,
             │                保证 C++20 / C++23 都能编
             ▼
   第 3 步 按需替换          先换 expected / print / monadic optional,
                              ranges::to 等顺手了再上

第 2 步的关键是:新特性和旧写法可以共存,用 feature-test 宏做闸门,不急着删旧代码。下面这段演示「同一份代码,C++20 和 C++23 都能编」的写法:

// verify: std=c++23
#include <optional>
#include <string>
#include <print>

std::optional<int> toInt(const std::string& s) {
    try { return std::stoi(s); } catch (...) { return std::nullopt; }
}

int doubleValue(const std::string& s) {
    auto r = toInt(s);
#if defined(__cpp_lib_optional) && __cpp_lib_optional >= 202110
    // C++23 起 optional 才有 monadic 操作,这里用 feature-test 宏做闸门
    return r.transform([](int x){ return x * 2; }).value_or(0);
#else
    // 回退到 C++20 的手写判空
    if (r.has_value()) return *r * 2;
    return 0;
#endif
}

int main() {
    std::println("doubleValue(\"21\") = {}", doubleValue("21"));
    std::println("doubleValue(\"xx\") = {}", doubleValue("xx"));
}
doubleValue("21") = 42
doubleValue("xx") = 0

这样升级不是「一次性切过去」,而是「新代码用新写法、旧代码原地不动、用宏在中间过渡」,风险摊薄到每次小提交里。

5. 延伸阅读

本知识库内的相关篇目:

6. 一句话总结

升 C++23 的结论是:开关一改基本就能编过(破坏性改动极少),然后按收益顺序替换:先上 std::expected、std::print、monadic optional,用 feature-test 宏做 C++20/C++23 共存的过渡闸门;唯一要记住的坑是 gcc 13 的 __cplusplus 还是 202100L,判特性别用它,用 __cpp_lib_*。

在职工程师的AI能力生长实战框架:47分钟日课与T型项目法 AI能力提升不是知识堆砌,而是认知操作系统升级——它始于对tokenization语义粒度、GPU计算路径、API接口契约等底层原理的穿透式理解。真正的掌握发生在动手造轮子的第37分钟,依赖环境调试、失败考古与最小可交付切口的闭环训练。技术价值体现在将重复性工作(如日报提炼、Bug步骤提取、邮件归类)转化为可复刻的T型项目,兼顾业务真实性和技术纵深。应用场景覆盖风控、测试、运营等非算法岗的日常提效,尤其适合白天写需求、晚上改bug、周末陪娃仍想持续进化的在职技术人。本文即基于Towards AI - Med 阅读详情

相关推荐

【信息科学与工程学】【制造工程】第三十六篇 机械工程与自动化101

本系统通过多模型集成、知识增强、主动学习和持续优化等关键技术,实现了高效、高质量的自动化文本语料标注。系统采用模块化设计,支持灵活扩展,能够处理不同类型的文本数据,适应多样的标注需求。

weixin_49199313的博客 970

Presto Release 0.298 深度解析:破坏性变更、物化视图增强与连接器能力升级

本指南基于 [release-0.298.rst](https://link.gitcode.com/i/386a1bc92689eac1cade6bd584dc2f89) 发布说明,系统梳理 Presto 0.298 版本的破坏性变更、核心亮点、通用查询引擎改进、各连接器能力增强与安全依赖升级。通过对照仓库源码(会话属性、标量函数、连接器配置等),帮助查询优化工程师、集群运维与数据平台开发者评估

gitblog_01183的博客 490

【信息科学与工程学】计算机科学与自动化-——第十五篇云计算 12 公有云里的“多Region + 多AZ“ 02 运营算法01

算法逐步思考推理思考(含数学方程式、对象、资源、任务、进程/协程/线程及对应的代数、约束、目标函数/传递函数/依赖函数、参数及参数的数值范围及边界条件、逐步推理的数学方程式列表、上下文切换、并发/串行/随机/乱序/顺序)算法逐步思考推理思考(含数学方程式、对象、资源、任务、进程/协程/线程及对应的代数、约束、目标函数/传递函数/依赖函数、参数及参数的数值范围及边界条件、逐步推理的数学方程式列表、上下文切换、并发/串行/随机/乱序/顺序)云厂商提高闲置资源利用率。算法复杂度为O(N),N为实例数量。

weixin_49199313的博客 282

测试链式调用与数据依赖:just-api套件内、跨套件Spec依赖实战

just-api 是一款基于 YAML 的 REST/GraphQL API 测试框架,它的 Spec 依赖机制可以解决 API 测试中的链式调用与数据依赖问题:通过 `before_test` 钩子和 `this.runSpec()` 先运行前置请求,把响应中的 token、id 等数据传递给后续请求,支持同套件内的套件内依赖,以及跨文件导入的跨套件依赖。 [![just-api 核心架构图:

gitblog_00102的博客 387

【信息科学与工程学】计算机科学与自动化 第二百零一十一 软件开发模型01

编号类型模型领域模型中的知识点/因素/参数关联知识和法律法规1传统顺序模型瀑布模型 (Waterfall)通用软件开发、硬件紧密耦合系统、政府/军工项目、需求稳定的传统信息系统严格线性阶段:可行性研究→需求分析(SRS,含功能/非功能/接口/约束,使用IEEE 830模板)→系统设计(概要设计HLD:架构、模块划分、数据库ER图;详细设计LLD:伪代码、类图、接口定义)→实现(编码规范、代码审查、静态分析工具SonarQube)→测试(单元测试JUnit、集成测试、系统测试、验收测试UAT,测试计划提前编写

weixin_49199313的博客 159

【信息科学与工程学】【安全领域】第八十七篇 网络空间安全中的数学物理约束01

密码学基础(对称加密/公钥加密/哈希/数字签名)密码分析学(差分分析/线性分析/侧信道)安全协议与形式化验证(认证协议/TLS/密钥交换)访问控制与身份认证(Bell-LaPadula/BIBA/RBAC/ABAC)网络安全与攻防对抗(DDoS/入侵检测/攻防博弈)恶意代码分析(传播动力学/图论模型)隐私保护(差分隐私/同态加密/多方计算)可信计算与硬件安全(TPM/侧信道/故障注入)风险评估与漏洞管理(CVSS/攻击图/贝叶斯网络)信息论安全(完善保密性/熵/信息泄露量化)约束:侧信道攻击中的功耗模型(R

weixin_49199313的博客 558

FastLED ESP32 RMT5 驱动深度指南:LED 协议控制、编码器架构与 Wi-Fi 抗干扰优化

本文聚焦 FastLED 在 ESP32 平台上的新一代 RMT5(ESP-IDF v5.x RMT 外设)驱动实现,系统讲解 LED 灯带协议控制(WS2812/SK6812/APA106)、RMT 编码器架构、多通道同步、RMT4→RMT5 迁移路径、内存管理与 DMA 配置,以及针对 Wi-Fi 中断抢占导致灯带闪烁的 Network-Aware 抗干扰方案。读完本文,你将掌握 RMT5 驱

gitblog_00880的博客 317

【Infracture】【数据中心】第十三篇 Ai infra中的“现象→根因→方案→关键参数/落地”01

现象:同步 RL step 里 99 分位输出长度是中位数的几倍到几十倍,整批等最慢几条;CoT/数学/代码尤甚,GPU 空泡严重,generation 占整体 50–80%、推理任务可到 80%+。根因方案矩阵落地红线:staleness K 先小(1→2→调),长尾不丢弃只延后;记录每条轨迹 policy_version、tokenizer_version、logprob、expert_route,便于重算 advantage 时做 off‑policy 修正。部署形态:gateway(router)→

weixin_49199313的博客 377

Envoy Mobile 技术指南:移动端网络库的定位、设计目标、同类对比与版本演进

Envoy Mobile 是构建在 Envoy 核心之上的 iOS / Android 客户端网络库,目标是把服务网格的收益(可观测性、一致性、xDS 动态配置)从数据中心一路延伸到移动端应用。本文基于 [mobile/docs/root/intro/intro.rst](https://link.gitcode.com/i/6afa257329701755b5ae7667ca976f30) 所在

gitblog_00073的博客 597

基于Java17、SpringBoot、vue3、antdv-next、uniapp等主流技术构建的全场景极速开发平台 MDP内置3个web端、1个移动端 重点解决用户中心、开发者平台、管理后台3个应

MDP-主数据平台,后端项目。专注于单点登录解决方案。内置用户中心、开发者平台、管理后台3个应用。包含:单点登录、Oauth2 登录、用户身份管理、应用申请、应用接入、主数据维护、主数据订阅、主数据广播、应用接口调用、接口管理管理和查看、系统配置等功能。

Win7时间修复(时间错误修复文件)

运行方法:解压后运行reg文件即可。 支持的Win7版本: 1. Windows 7 Starter(入门版 / 初级版) 2. Windows 7 Home Basic(家庭普通版) 3. Windows 7 Home Premium(家庭高级版) 4. Windows 7 Professional(专业版) 5. Windows 7 Enterprise(企业版) 6. Windows 7 Ultimate(旗舰版) 7. Windows 7 Professional for Embedded Systems(嵌入式专业版) 8. Windows 7 Ultimate for Embedded Systems(嵌入式旗舰版)

大模型月抛时代:从模型适配层到本地部署的工程实践指南

大模型技术迭代正以惊人频率加速,模型发布周期不断缩短,开发者面临频繁更换模型的现实挑战。理解模型评估、推理精度、部署工具链与架构设计,是应对这一趋势的基础。深度学习模型从训练到推理涉及精度选择、显存优化与性能调优,FP16、BF16等精度格式直接影响资源占用与输出质量。借助Ollama、vLLM等工具实现本地部署与云端API的统一接入,通过模型适配层解耦业务逻辑与具体模型,并建立自动化评测机制辅助选型,能够有效降低切换成本。这一方法论广泛应用于RAG、Agent及企业级AI应用开发场景。文章结合代码示例与配

weixin_34095889的博客 382

科技中介服务机构想要提升服务效率,需要哪些数智工具支持?.docx

科技中介服务机构想要提升服务效率,需要哪些数智工具支持?

基于变频控制的多相交错LLC谐振变换器闭环仿真(Simulink仿真实现)

基于变频控制的多相交错LLC谐振变换器闭环仿真(Simulink仿真实现)内容概要:本文主要介绍了基于Plecs的全桥LLC谐振变换器仿真模型,涵盖变频控制下的多相交错LLC谐振变换器闭环仿真、V2G电动汽车ACDC整流与双向CLLC谐振变换器充放电仿真、LLC谐振变换器的开环与闭环软启动设计,以及储能系统中双向Buck-Boost变换器结合模型预测电流控制和电压下垂控制的仿真研究。同时,文档列举了多种电力电子系统与控制策略的Simulink/Plecs仿真案例,涉及三相交错并联Buck变换器、三电平Buck直流变换器、单相Boost PFC电路等,展示了丰富的电力变换器建模与控制技术。此外,还包括参数设计报告、计算书及相关参考文献,适用于从事电力电子、新能源发电、电动汽车充放电系统等领域的研究人员和技术开发人员。; 适合人群:具备电力电子、自动控制理论基础,从事新能源、电动汽车、电力系统等相关领域研究的研发人员、高校研究生及高年级本科生。; 使用场景及目标:① 学习和掌握LLC谐振变换器及其他典型电力电子变换器的工作原理与建模方法;② 实现闭环控制策略如变频控制、软启动、模型预测控制、下垂控制等的仿真验证;③ 支持科研项目、毕业设计或工程开发中的系统仿真与优化设计。; 阅读建议:建议结合文中提供的仿真模型、设计报告与参考文献,逐步搭建并调试相应系统,重点关注控制策略的实现细节与参数整定过程,以深入理解系统动态响应特性与控制性能。

usb 扩容盘检测修复工具源码,编译产物

usb 扩容盘检测修复工具源码,编译产物

融合UWB和IMU割草机定位EKF研究(Matlab代码实现)

内容概要:本文主要介绍了一个名为“Plecs全桥LLC谐振变换器仿真模型”的技术资源,该资源聚焦于电力电子领域中的LLC谐振变换器建模与仿真,涵盖开环、闭环控制、软启动设计及参数优化等核心内容。文档不仅提供了LLC变换器的详细建模方法与仿真案例,还系统梳理了其在高效电源转换系统中的应用,包括隔离型全桥拓扑结构的设计与性能分析。此外,资源汇总了大量Matlab/Simulink仿真模型及相关科研方向,涉及新能源并网、储能控制、电机驱动等多个前沿领域,全面展示LLC谐振变换器在现代电力系统中的关键技术实现路径。同时,文档附带多种学习资料获取途径,如网盘链接和公众号资源,便于研究人员深入实践与拓展研究。; 适合人群:具备扎实的电力电子、自动控制理论基础,从事新能源发电、开关电源设计、电力系统仿真等相关领域的研究生、工程师及科研人员。; 使用场景及目标:①深入理解LLC谐振变换器的工作原理、建模方法与控制策略;②开展电力电子变换器的仿真验证与参数优化设计;③支撑科研项目、学位论文或工程项目的系统仿真与方案验证; 阅读建议:建议结合所提供的仿真模型与参考文献,使用Plecs或Simulink软件进行动手实践,重点掌握LLC谐振变换器的建模流程、闭环控制设计、软启动机制及参数调试技巧,以全面提升在实际工程中的应用与创新能力。

独立储能的现货电能量与调频辅助服务市场出清协调机制(Matlab代码实现)

内容概要:本文标题为“Plecs全桥LLC谐振变换器仿真模型”,但实际内容严重偏离主题,文档中混杂了大量来自优快云博客平台的无关信息,涵盖多个不同领域的Matlab/Simulink仿真项目,如电力系统优化、无人机路径规划、机器学习预测、微电网调度、卡尔曼滤波、无线能量传输等,导致核心内容缺失。文档未能提供关于Plecs平台下全桥LLC谐振变换器的建模方法、电路结构、参数设计、控制策略或仿真结果等关键技术细节,实质信息与标题完全不符,不具备作为该主题参考资料的有效性。; 适合人群:从事电力电子变换器研究、电源系统设计及相关领域的工程师、高校研究生与科研人员,尤其是希望掌握LLC谐振变换器建模与仿真的专业技术人员。; 使用场景及目标:① 学习并掌握全桥LLC谐振变换器的工作原理与Plecs仿真建模技术;② 开展高效电源转换器的研发与性能优化;③ 作为教学或科研项目中电力电子电路仿真的参考资料。; 阅读建议:鉴于文档内容与标题严重不符,建议读者谨慎甄别,优先选择专业书籍、学术论文或官方仿真软件教程等权威资源进行学习,避免被无效信息误导。

企业微信获取code,URL详解

“https://open.weixin.qq.com/connect/oauth2/authorize?”+ “appid=”企业ID “&redirect_uri=”重定向路径+ “&agentid=”小程序AgentId+ “&response_type=code&scope=snsapi_userinfo&state=123&conn...

weixin_44804985的博客 8734
上一篇: std::launder、std::bit_cast 与 placement new:合法绕过别名
下一篇: 指定初始化器:C++20 给聚合初始化补上的最后一块
无名猿
博客等级 码龄10年 61粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值