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로 증가시킵니다. 누구든지 매개 변수의 이름을 지정하면됩니다.
r0nG
'char_type * const'로 선언 될 수 있다고 주장 할 수 있지만'char_type *'로 변환 할 수 없기 때문에'char_type const *'는 작동하지 않습니다. – 0x499602D2
스트림에서 get 영역의 시작과 끝은 스트림의 시작과 끝이 아니라 로컬 버퍼의 끝과 끝과 일치합니다. 실제로, 대부분의 스트림 구현은 하나의 get 버퍼만을 사용하므로 경계가 변경되지 않지만 더 복잡한 버퍼링을 사용하는 스트림 구현에있을 수 있습니다. 귀하의 답변에 대해 –