std::format 表现不同。有符号字符/无符号字符之间

Pav*_*aka 3 c++ c++20

这种行为是预期的还是按照标准(使用 VC 编译器)?

示例 1(有符号字符):

char s = 'R'
std::cout << s << std::endl;         // Prints R.
std::cout << std::format("{}\n", s); // Prints R.
Run Code Online (Sandbox Code Playgroud)

示例 2(无符号字符):

unsigned char u = 'R';
std::cout << u << std::endl;         // Prints R.
std::cout << std::format("{}\n", u); // Prints 82.
Run Code Online (Sandbox Code Playgroud)

在第二个示例中std::format, ,u被打印为82而不是R,这是一个错误还是预期的行为?

如果不使用std::format,如果只是通过std::cout,我就会得到R两个例子。

use*_*522 9

这是有意为之并在标准中指定的。

和基本上char都是unsigned char数字类型。通常仅char具有代表字符的附加含义。例如,没有unsigned char字符串文字。如果unsigned char使用,通常别名为std::uint8_t,那么它通常应该表示一个数值(或内存的原始字节,尽管std::byte这是更好的选择)。

因此,默认情况下选择数字解释unsigned char和字符解释是有意义的。char在这两种情况下,都可以使用{:c}字符解释和{:d}数字解释的说明符进行覆盖。

我认为operator<<的行为是非直观的,但这种行为已经存在了很长时间并且可能无法改变。


另请注意,它是与和signed char完全不同的类型,并且它是实现定义的是否是有符号或无符号整数类型(但始终与 和 char 不同)。charunsigned charcharsignedunsigned

如果您使用signed char它,默认情况下它也会被解释为数字,原因与unsigned char此相同。