设计:
.agents/docs/2026-07-31-cpp20-standard-support-design.md(review 已定案) 基线:7af26ba· 分支:feat/cpp20-standard定案回顾:MSVC 取 20(带cl ≥ 19.38版本阈值)· 不动 scaffold/模板 · 不加"显式声明"位
src/manifest/types.cppm::normalize_cpp_standard:加c++20/c++2a(level 20,gnu=false)、gnu++20/gnu++2a(level 20,gnu=true);错误文案补全新值。- 验证:
tests/unit/test_manifest.cpp新增用例;mcpp build对standard="c++19"仍报错且文案含 c++20。
src/toolchain/model.cppm:int importStdMinLevel = 0;(0 = 未知,走旧布尔语义)。- provider 赋值(与
hasImportStd同点,知识留在各自 provider):gcc.cppm::enrich_toolchain→ 20clang.cppm::enrich_toolchainlibc++ 分支 → 20;MSVC STL 回退分支 →msvc_std_min_level(tc)msvc.cppm→msvc_std_min_level(tc),由本地toolset_at_least(tc, 19, 38)决定 20 / 23
- 验证:单测构造
Toolchain{MSVC, "19.37"}→ 23,"19.44"→ 20。
src/build/prepare.cppm:3735之后追加档位判断 + 可行动文案(设计 §4.2)。- 本地小函数
std_level_name(int)(20/23/26 → "c++20"…),不造第二张表。 - 验证:单测覆盖文案;e2e 177(Windows)覆盖真机。
src/build/build_program.cppm:run_build_program的cppStandard形参改为const manifest::CppStandardConfig&,内部用cppfly::std_flag(hostTc, canonical, level)。- 调用点:
prepare.cppm:3479(依赖)、prepare.cppm:3606(根)传.cppStandard整体。 - 验证:单测/或 e2e 92(build.mcpp import)保持绿;新增 c++fly 工程 + build.mcpp 的回归(单测层足够)。
test_manifest.cpp / test_toolchain_dialect.cpp / test_cppfly.cpp /
test_cache_key.cpp / test_fingerprint.cpp / 新增门测试。
175_cpp20_import_std.sh— c++20 + import std,构建/运行/-std=c++20断言(POSIX)176_cpp20_std_bmi_isolation.sh— c++23 与 c++20 交替构建,两套缓存并存177_cpp20_msvc.sh— Windows:/std:c++20+ import std 硬断言 + 打印cl版本
src/toolchain/fingerprint.cppm::MCPP_VERSION→2026.7.31.1- bootstrap pin(
.xlings.json/MCPP_PIN)不动(自举起点,不随发布走) scripts/check_version_pins.sh通过- 文档已在设计阶段更新(EN/ZH),与本 PR 同批合入
mcpp build -p mcpp → 单测全绿 → tests/e2e/run_all.sh(至少 175/176 + 回归面)
单 PR,bypass squash 合入 main。
release(四平台)→ gitcode 资源本地 gtc 补传 + GET 核验 → xim-pkgindex PR →
xlings install mcpp 真装验证 → bootstrap pin bump。
scaffold/模板改动、mcpp new --standard、依赖 floor 检查、"显式声明"位、C++17。