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

xml*_*lmx 28 c++ unsigned signed iostream language-lawyer

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

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

据我所知,流的大小永远不会是负数,因此,我的问题是:

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

Sha*_*our 20

草案C++标准有以下脚注296中部分27.5.2 类型其中说:

在大多数ISO C将使用size_t的地方使用streamsize.除了需要负值的strstreambuf构造函数之外,streamsize的大多数用法都可以使用size_t.它应该是对应于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);
Run Code Online (Sandbox Code Playgroud)

并说:

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

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

- 如果n> 0,则N为n.

- 如果n == 0,则N是std :: strlen(gnext_arg).

- 如果n <0,则N为INT_MAX.336

对于这个要求来说,这似乎是一个不好的论据,封闭式问题255也有类似于Howard Hinnant的评论:

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

  • 将`std :: streamsize`定义为仅用于支持这种特殊情况的"std :: streamsize"似乎太沉重和反直觉. (9认同)
  • `std :: count`的返回类型是很好的设计.它签了.因为无符号与混合类型表达式中的不幸促销相关联,因此需要一些基本原理,因此有点冒险,正如通常的编译器警告用于比较所证明的那样. (4认同)
  • 简而言之,争论签署这种类型的"理由"是相当愚蠢的.signed是默认的无问题选择.没有提出使其无签名的正当理由. (4认同)
  • @xmllmx霍华德·海因南特(Howard Hinnant)似乎同意您的意见,但似乎委员会选择保留它。 (2认同)
  • @Cheersandhth.-Alf 我不太了解你,标准委员会提供了两条关于此功能基本原理的独立信息。他们自己似乎认为在脚注中签名以进行解释很奇怪。 (2认同)