c++ - std:: streamsize가 서명되지 않고 서명 된 것으로 정의 된 이유는 무엇입니까?



iostream language-lawyer (1)

초안 C ++ 표준27.5.2 절에 다음 각주 296 이 있습니다.

streamsize는 ISO C가 size_t를 사용하는 대부분의 장소에서 사용됩니다. 대부분의 streamize 사용은 음의 값을 필요로하는 strstreambuf 생성자를 제외하고는 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);

라고 :

gnext_arg는 요소의 수 N이 다음과 같이 결정되는 배열 객체의 첫 번째 요소를 가리켜 야합니다 :

다음의 설명에서 우리는 streamsize 타입 인 n 이 참으로 음의 값을 가질 수 있어야한다는 것을 알 수 있습니다.

- n> 0이면 N은 n입니다.

- n == 0이면 N은 std :: strlen (gnext_arg)입니다.

- n <0이면 N은 INT_MAX 입니다. 336

이것은이 요구 사항에 대한 가난한 주장처럼 보입니다. 닫힌 이슈 255Howard Hinnant 와 비슷한 코멘트를 가지고 있습니다 :

이것은 nit의 무언가이지만, streamoff가 streamize보다 나은 선택이 아닌지 궁금합니다. pbump와 gbump의 인수는 반드시 서명되어야합니다. [...] 이것은 pbump와 gbump에 대한 논의에 대해 약간 약한 것처럼 보입니다. 우리가 정말로 strstream을 제거해야한다면,이 각주는 streamize를 서명하게하는 이유와 함께 그것과 함께 갈 것입니다.

http://en.cppreference.com/w/cpp/io/streamsize 에 따르면

std :: streamsize 형식은 I / O 작업에서 전송 된 문자 수 또는 I / O 버퍼 크기를 나타내는 데 사용되는 부호있는 정수 형식입니다.

내가 생각할 수있는 한 스트림의 크기는 결코 음수가 될 수 없으므로 제 질문은 다음과 같습니다.

std::streamsize서명되지 않고 서명 된 것으로 정의 된 이유는 무엇입니까? 뒤에있는 이유는 무엇입니까?





signed