败犬日报 2026-02-25
败犬日报 2026-02-25
1. MSVC std::format 编译期检查只对部分预定义的执行字符集生效
又是编码的坑。
编译期检查,比如类型不匹配 std::format("{:d}", 42.0); 或参数数量不对。
因为 std::format 要在编译期检查找占位符 { 0x7B 和 } 0x7D,有些多字节编码就可能在字符的后几个字节出现 0x7B / 0x7D 导致问题。
Windows 默认执行字符集绑定 Active Code Page,由于 Active Code Page 可变,所以支持 std::format 编译期检查就是要支持所有字符集,这不现实,于是就直接不做了。
所以要指定 /utf-8。UTF-8 的非 ASCII 字符可以保证每个字节最高位是 1,可以按解析起来很容易。
GCC / Clang 基本上统一了 UTF-8 编码,就很少碰到这个问题。