2017-12-14 14 views
2

std::basic_streambuf 클래스의 setg() 함수를 확인하고 있습니다. streambuf 파일에 정의되어 있습니다.함수 std :: basic_streambuf :: setg()가 비 const 도구를 사용하는 이유

GCC 버전은 내가 사용하고 컴파일 옵션은 멤버 변수로 선언 -std=gnu++14

void 
setg(char_type* __gbeg, char_type* __gnext, char_type* __gend) 
{ 
    _M_in_beg = __gbeg; 
    _M_in_cur = __gnext; 
    _M_in_end = __gend; 
} 

입니다 5.4.0

입니다 :

char_type*  _M_in_beg;  ///< Start of get area. 
char_type*  _M_in_cur;  ///< Current read area. 
char_type*  _M_in_end;  ///< End of get area. 
char_type*  _M_out_beg; ///< Start of put area. 
char_type*  _M_out_cur; ///< Current put area. 
char_type*  _M_out_end; ///< End of put area. 

는 이해가 그 회원 가입일 변수가 비 const 인 경우 char_type*, 함수 setg()은 비 const 인수 만 사용할 수 있습니다. 하지만 그 포인터의 목적은 물건을 가져 오는 것입니다, 그 포인터 char_type *은 처음에 const char_type*으로 선언되어야합니다, 맞습니까?

멤버 변수 포인터가 const 포인터가 아니기 때문에 필자는 포인터가 가리키는 값을 특정 상황에서 변경할 수 있다고 가정합니다.

제 질문은 어떤 상황에서 basic_streambuf 개체가 가져 오기 영역의 값을 변경합니까? get 영역의 내용이 변경되지 않으면 const 포인터 cosnt char_type*을 사용하면 안되는 이유가 있습니까? [정보

void 
setg(char_type const* __gbeg, char_type const* __gnext, char_type const* __gend) 

비트의 배경 스토리 :

char_type const *_M_in_beg;  ///< Start of get area. 
char_type const *_M_in_cur;  ///< Current read area. 
char_type const *_M_in_end;  ///< End of get area. 
char_type  *_M_out_beg; ///< Start of put area. 
char_type  *_M_out_cur; ///< Current put area. 
char_type  *_M_out_end; ///< End of put area. 

는 그래서 setg()과 같이 선언 할 수 있습니다 : 그 경우에 편집 한

, 멤버 변수를 선언 할 수 있습니다 문제. 제 동료는 foo() 함수를 수정하여 setg()을 호출하므로 입력 매개 변수는 비 const입니다. 입력 매개 변수 foo()은 수정하면 안됩니다. 매개 변수 setg()은 비 const입니다. foo()의 함수 매개 변수는 const 일 수 없습니다. 유닛 테스트를 거친 수정은 케이스를 테스트했지만 수정으로 인한 실패로 인해 입력 값이 변경되었습니다. setg()이 우선 const를 사용하면 세상이 더 좋습니다. 편집 한

PS 내가 다시 변수 이름은 저를 감동 기능, _gnext로 명명 된 기능 setg()의 두 번째 매개 변수를 읽고이 _M_in_cur라는 포인터에 할당되는 동안의
끝, 나는 거의 내 코드를 수정 함수에 전달되기 전에 포인터를 1로 증가시킵니다. 누구든지 매개 변수의 이름을 지정하면됩니다.

basic_streambuf reference

r0nG

+0

'char_type * const'로 선언 될 수 있다고 주장 할 수 있지만'char_type *'로 변환 할 수 없기 때문에'char_type const *'는 작동하지 않습니다. – 0x499602D2

+0

스트림에서 get 영역의 시작과 끝은 스트림의 시작과 끝이 아니라 로컬 버퍼의 끝과 끝과 일치합니다. 실제로, 대부분의 스트림 구현은 하나의 get 버퍼만을 사용하므로 경계가 변경되지 않지만 더 복잡한 버퍼링을 사용하는 스트림 구현에있을 수 있습니다. 귀하의 답변에 대해 –

답변

0

가져 오기 영역은 관련 입력 순서의 문자를 읽기위한 버퍼입니다을 제공 할 수있는 설명은 사전에 감사합니다.read 메소드가 불려 갔지만 get 영역에 문자가 충분하지 않은 경우 basic_streambuf 객체는 연관된 입력 시퀀스를 읽어 get 영역의 내용을 업데이트합니다. 이 경우 가져 오기 영역의 내용이 수정됩니다.

+0

주셔서 감사합니다. 내 질문을 업데이트하여 더 명확하게했습니다. AFAIU, get 영역은 연관된 스트림을 가리키는 3 포인터입니다. 그래서 기본적으로 업데이트는 영역 연산이 새로운 위치를 가리 키도록 포인터 값을 변경한다고 생각합니다. – r0ng

+0

@ r0ng 어쨌든 연관된 입력 시퀀스에서이 포인터가 가리키는 곳으로 문자를로드해야합니다.이 작업은 아마도 이러한 포인터를 통해 수행되므로'const char_type *'으로 정의 할 수 없습니다. 물론이 포인터가 아닌 다른 포인터 나 glvalues를 통해로드를 수행하거나 관련 입력 시퀀스를 직접 가리킬 수 있지만 표준에서는 ** const **에 ** const char_type * 그렇게하기위한 구현. 귀하의 배경에, 나는이 포인터로 귀하의 주장을 사용하는 것이 좋습니다 생각하지 않습니다. – xskxzr