Ответ 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 подписанным.