为什么std :: streamsize被定义为signed而不是unsigned?

时间:2014-06-30 01:53:28

标签: c++ iostream language-lawyer unsigned signed

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

  

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

据我所知,流的大小永远不会是负面的,所以,我的问题是:

为什么std::streamsize被定义为已签名而不是未签名?背后的理由是什么?

1 个答案:

答案 0 :(得分:18)

draft C++ standard296 类型部分中有以下脚注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签名的原因。