为什么标准库使用 static_cast to unsigned char 进行 char 相等性比较?

Why do the standard library use static_cast to unsigned char for char equality comparison?

提问人:Fareanor 提问时间:10/25/2023 更新时间:10/25/2023 访问量:52

问:

从字符类型相等比较的参考文档中,我阅读了以下内容:std::char_traits<>::eq()

  1. 比较 和 为了相等,行为与ab
  • static_cast<unsigned char>(a) == static_cast<unsigned char>(b),如果 char_type 是 char,
  • a == b否则。

我想知道如果类型是?static_castunsigned charchar

我很难理解,如果我们只想比较它们的平等性,为什么我们要关心它们的标志性(无论它是否在当前平台上)。charsigned

C++ 字符 比较

评论

0赞 BoP 10/25/2023
只是为了保持一致性,所有比较都是“好像”值是无符号的。cplusplus.github.io/LWG/issue467
0赞 Fareanor 10/25/2023
@RichardCritten 噢,确实,解释就在我眼皮底下......

答:

1赞 Fareanor 10/25/2023 #1

在同一参考页面中,答案在“缺陷报告”部分给出(见下文)。


以下行为更改缺陷报告追溯应用于以前发布的 C++ 标准。

博士 适用于 发布的行为 正确的行为
LWG 467型 C++98 对于 std::char_traits<char>,eq() 和 lt() 的语义分别与内置和 on char 相同[1]==< 更改为内置和无符号字符==<

↑ 大多数实现调用 std::memcmp() 以提高效率,它将数据解释为无符号字符数组。如果在此类实现上对 char 进行了签名,则 std::char_traits<char> 无法满足 CharTraits 的要求。