此行为是否符合预期或标准(使用VC编译器)?
示例1(有符号字符):
char s = 'R'
std::cout << s << std::endl; // Prints R.
std::cout << std::format("{}\n", s); // Prints R.
示例2(无符号字符):
unsigned char u = 'R';
std::cout << u << std::endl; // Prints R.
std::cout << std::format("{}\n", u); // Prints 82.
在std::format
的第二个示例中,u
被打印为82
而不是R
,这是一个错误还是预期行为?
如果不使用std::format
,而只使用std::cout
,则在两个示例中都得到R
。
2条答案
按热度按时间xqnpmsa81#
这是有意的,并在标准中作了规定。
char
和unsigned char
基本上都是数值类型。通常只有char
具有表示字符的附加含义。例如,没有unsigned char
字符串文字。如果使用unsigned char
(通常别名为std::uint8_t
),则通常假定它表示数值(或者内存的原始字节,尽管std::byte
是更好的选择)。因此,默认情况下为
unsigned char
选择数字解释,为char
选择字符解释是有意义的,在这两种情况下,都可以用{:c}
作为字符解释的说明符,用{:d}
作为数字解释的说明符。我认为
operator<<
的行为是非直观的,但这已经存在了很长时间,可能无法改变。还要注意,
signed char
是与char
和unsigned char
完全不同的类型,并且char
是有符号整数类型还是无符号整数类型是由实现定义的(但总是与signed
和unsigned
char不同)。如果您使用
signed char
,它也会被默认解释为数字,原因与unsigned char
相同。czfnxgou2#
在第二个示例
std::format
中,它被打印为82而不是'R'
,这是一个问题还是标准?这是标准根据format.string.std(https://eel.is/c++draft/tab:format.type.int)定义的行为:
| 类型|意义|
| - ------|- ------|
| ...|...|
|
c
|将字符static_cast<charT>(value)
复制到输出。如果value
不在charT
的可表示值范围内,则引发format_error
。||
d
|to_chars(first, last, value)
.|| ...|...|
| 无|与
d
相同。[* 注8*:如果格式化参数类型为charT
或bool
,则默认值分别为c
或s
。- * 结束注解 *]|对于整数类型,如果未指定 type 选项,则
d
将是默认值。由于unsigned char
是整数类型,因此它将被解释为整数,其值将是由std::to_chars
转换的值。(除
charT
类型和bool
类型外,默认 * 类型 * 选项为c
或s
)