根据http://en.cppreference.com/w/cpp/io/streamsize
std :: streamsize类型是用于表示的有符号整数类型 在I / O操作中传输的字符数或大小 I / O缓冲区。
据我所知,流的大小永远不会是负面的,所以,我的问题是:
为什么std::streamsize
被定义为已签名而不是未签名?背后的理由是什么?
答案 0 :(得分:18)
draft C++ standard在296
类型部分中有以下脚注27.5.2
,其中包含:
streamsize用于ISO C将使用size_t的大多数地方。最 streamize的用法可以使用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)。
- 如果n< 0,N为INT_MAX 。 336
对于这个要求,这似乎是一个不好的论据,而closed issue 255也有来自 Howard Hinnant 的类似评论,其中说:
这是一个不错的东西,但我想知道如果没有流量不是 比streamize更好的选择。 pbump和gbump的论点必须 签字。 [...]对于pbump的论证来说,这似乎有点弱 和gbump。我们是否应该真正摆脱strstream,这个脚注 可能会继续使用它,以及使streamize签名的原因。