为什么 std::streamsize 定义为有符号而不是无符号?

2024-01-03

根据http://en.cppreference.com/w/cpp/io/streamsize http://en.cppreference.com/w/cpp/io/streamsize

std::streamsize 类型是有符号整型,用于表示 I/O 操作中传输的字符数或大小 I/O 缓冲区。

据我想象,流的大小永远不能为负,所以,我的问题是:

Why is std::streamsize定义为signed而不是unsigned?背后的原理是什么?


The C++ 标准草案 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3485.pdf有以下脚注296在部分27.5.2 Types其中说:

Streamsize 用于 ISO C 使用 size_t 的大多数地方。最多 Streamsize 的用途可以使用 size_t,除了 strstreambuf 构造函数,需要负值。它应该 可能是与 size_t 对应的有符号类型(这就是 Posix.2 调用 ssize_t)。

我们可以在部分看到D.7.1.1 strstreambuf 构造函数我们有以下条目(强调我的前进):

strstreambuf(char* gnext_arg, streamsize n, char *pbeg_arg = 0);
strstreambuf(signed char* gnext_arg, streamsize n,
   signed char *pbeg_arg = 0);
strstreambuf(unsigned char* gnext_arg, streamsize n,
   unsigned char *pbeg_arg = 0);

并说:

gnext_arg 应指向数组对象的第一个元素,其 元素数量 N 确定如下:

从下面的讨论中我们可以看出n这是类型streamsize确实需要能够取负值:

— 如果 n > 0,则 N 为 n。

— 如果 n == 0,则 N 为 std::strlen(gnext_arg)。

If n < 0, N is INT_MAX.336

对于这一要求,这似乎是一个糟糕的论据已关闭问题 255 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2942.html#255有类似的评论霍华德·希南特其中说:

这有点小问题,但我想知道流是否不会 比 Streamsize 更好的选择。 pbump 和 gbump 的参数必须 被签署。 [...] 这对于 pbump 的论点来说似乎有点弱 和gbump。我们是否应该真正摆脱 strstream,这个脚注 可能会随之而来,以及使 Streamsize 签名的原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 std::streamsize 定义为有符号而不是无符号? 的相关文章

随机推荐