【问题标题】:Why is std::streamsize defined as signed rather than unsigned?为什么 std::streamsize 被定义为有符号而不是无符号?
【发布时间】:2014-08-20 08:19:11
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    draft C++ standard27.5.2 Types 部分有以下脚注296

    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 的确定如下:

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

    ——如果n > 0,N就是n。

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

    如果 n 。336

    对于这个要求,这似乎是一个糟糕的论据,closed issue 255 有来自 Howard Hinnant 的类似评论,其中说:

    这有点小题大做,但我想知道 streamoff 是否不会 比streamsize更好的选择。 pbump 和 gbump 的参数必须 签署。 [...] 对于 pbump 的论点,这似乎有点弱 和 gbump。我们是否真的应该摆脱 strstream,这个脚注 可能会使用它,以及使流大小签名的原因。

    【讨论】:

    • std::streamsize 定义为仅用于支持这种特殊情况的签名似乎太沉重且违反直觉。
    • @xmllmx Howard Hinnant 似乎同意你的观点,但看起来委员会选择保持原样。
    • std::count 的返回类型是好的设计。它已签署。将其设为无符号需要一些理由,因为无符号与混合类型表达式中的不幸提升相关联,因此有点冒险,正如通常的编译器比较警告所证明的那样。
    • 简而言之,争论使类型签名的“原因”是相当愚蠢的。签名是默认的无问题选择。没有提出使其未签名的正当理由。
    • @Cheersandhth.-Alf 我不太了解你,标准委员会提供了关于此功能基本原理的两条独立信息。他们自己似乎认为有一个 size type 被签名他们放在脚注中解释是很奇怪的。
    猜你喜欢
    • 2015-05-11
    • 1970-01-01
    • 2015-12-27
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    相关资源
    最近更新 更多