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签名的原因.