主要观点:
- C++23 引入了一些与编码相关的更改,旨在使代码在不同平台和编译器上能按预期工作且具有可移植性。
关键信息: - 修剪行拼接前的空白字符:C++20 时不同编译器对特定代码的输出不同,C++23 改变了这种情况,将 GCC/Clang 的处理方式标准化,许多 IDE 等已丢弃尾部空白字符。
- 去除混合宽字符串字面量连接:相邻字符串字面量可连接,若有编码前缀,不同前缀混合连接行为是实现定义的,C++23 将其标准化,所有混合编码前缀都被视为格式错误。
- 一致的字符字面量编码:C++20 时预处理条件中的字符字面量值与表达式中的可能不同,C++23 的 P2316R2 调整标准使其值相同。
- C++20 核心论文的缺失特性测试宏:一些特性测试宏缺失或未按需要更新,P2493R0 提议更新部分宏的值。
- 字符集和编码:P2314R4 引入术语变化和行为调整,如“通用字符名”的形成方式改变,主要影响标准对实现行为的反映。
- 支持 UTF-8 作为可移植源文件编码:P2295R6 规定必须接受 UTF-8 作为输入格式,以增加通用性和确保 Unicode 相关功能的广泛使用,各编译器对非 UTF-8 输入的处理不同。
- 明确 chrono 类型本地化格式化中的编码处理:C++20 中
std::format
对 chrono 类型格式化在区域设置和字面量编码不匹配时未指定处理方式,P2419R2 允许进行转码或替换区域设置以避免“Mojibake”。
重要细节: - 各更改的具体示例及不同编译器的处理情况,如上述各部分中给出的代码示例及不同编译器的输出。
- 各提案的相关论文链接,如 P2223R2、P2201R1 等。
- 各编译器对 UTF-8 及非 UTF-8 输入的不同处理方式,如 MSVC、Clang、GCC 的情况。
- “Mojibake”的定义及示例。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。