Hical 踩坑实录五部曲(二):MSVC / GCC / Clang 三平台 C++20 编译差异
Hical 踩坑实录五部曲(二):MSVC / GCC / Clang 三平台 C++20 编译差异 引言 Hical 从第一天起就要求在 GCC 14+、Clang 20+、MSVC 2022+ 三个编译器上通过 CI。框架大量使用了 C++20 新特性:Concepts、co_await 协程、PMR 内存池、std::format、__VA_OPT__ 递归宏。 三平台兼容的代价就是踩三倍的坑。 这篇文章记录了开发 Hical 过程中遇到的编译器差异踩坑——每个坑按统一结构展开:现象 → 最小复现 → 根因 → 解决方案。 目录 Hical 踩坑实录五部曲(二):MSVC / GCC / Clang 三平台 C++20 编译差异 引言 目录 坑 1:模板参数推导差异——GCC 过、MSVC 报错 坑 2:Concepts 约束检查时机差异 坑 3:__VA_OPT__ 宏展开行为差异 坑 4:PMR allocator 传播行为差异 坑 5:std::format 可用性与行为差异 坑 6:协程 promise_type 与异常处理差异 坑 7:链接顺序敏感——Windows 特有的 ws2_32 问题 经验总结:三平台兼容清单 编译器设置 C++20 特性 协程 一般性 坑 1:模板参数推导差异——GCC 过、MSVC 报错 现象:一段在 GCC 14 上完美编译的透明哈希代码,在 MSVC 上报 C2672: no matching overloaded function found。 ...