C++20 的 u8/char8_t 向后兼容翻车:同一段代码在 C++17 能编,到 C++20 就报错
来源: giodicanio.com — 2026-09-11
概述
文章用最小例子打破「每个新 C++ 版本都向后兼容」的迷思:C++17 下能把 u8 字面量直接传给接收 const char* 的函数,切到 C++20 就编译失败,因为 u8 字面量的类型从 const char[N] 变成了 const char8_t[N],编码仍是 UTF-8。对依赖旧标准的大型库与既有代码库来说,升级标准时这类破坏会集中爆发。
核心要点
- MSVC 的报错是:无法把 const char8_t* 转换为 const char*。
- C++11/14/17 下 u8 字面量是 const char[N],C++20 起变成 const char8_t[N],编码依然是 UTF-8。
- 影响是真实的:大型库和既有代码库一旦切到 C++20 模式,原本能编的代码会突然编译失败。
- 缓解办法之一是尽量避免使用 u8 前缀,Google 的 C++ 风格指南目前正是这样建议的。
- 指南还提醒:u8 的语义在 C++23 里还会再变一次。
金句
有一种迷思认为每个新的 C++ 版本都与旧版本向后兼容——总体上有这个趋势,但并不总是如此。
👍 0
👎 0
返回 Lobsters 首页