Подтвердить что ты не робот

Почему std:: streamsize определяется как подписанный, а не без знака?

Согласно http://en.cppreference.com/w/cpp/io/streamsize

Тип std:: streamsize - это подписанный интегральный тип, используемый для представления количество символов, переданных в операции ввода-вывода или размер буфера ввода/вывода.

Насколько я могу себе представить, размер потока никогда не может быть отрицательным, поэтому мой вопрос:

Почему std::streamsize определяется как подписанный, а не без знака? Какое обоснование?

4b9b3361

Ответ 1

проект стандарта С++ содержит следующую сноску 296 в разделе 27.5.2 Типы, в которой говорится:

streamsize используется в большинстве мест, где ISO C будет использовать size_t. Наиболее использования streamsize может использовать size_t, за исключением strstreambuf, которые требуют отрицательных значений. Должно вероятно, будет подписанный тип, соответствующий size_t (что и есть Posix.2 вызывает ssize_t).

и мы видим, что в конструкциях D.7.1.1 strstreambuf в разделе D.7.1.1 мы имеем следующие записи (акцент мой вперед):

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

Это кажется плохим аргументом для этого требования, а закрытый вопрос 255 имеет аналогичный комментарий от Говарда Хиннанта, который гласит:

Это что-то вроде нит, но мне интересно, не будет ли поток лучший выбор, чем поток. Аргумент к pbump и gbump ДОЛЖЕН быть подписаны. [...] Это кажется немного слабым для аргумента pbump и gbump. Если мы когда-нибудь действительно избавимся от strstream, эта сноска может пойти вместе с ним, а также с тем, чтобы сделать streamsize подписанным.