2017-12-14 18 views
2

std::basic_streambufの関数setg()をチェックしています。 streambufファイルで定義されています。メンバ変数は次のように宣言されている私が使用していますなぜstd :: basic_streambuf :: setg()関数が非const型ツールを使用するのですか

gccのバージョンは5.4.0

あるコンパイルオプションは-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; 
} 

です:

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 areaの内容が変更されない場合は、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()のように宣言することができますように、その場合には編集1

、メンバ変数を宣言することができます質問。私の同僚はfoo()という関数を変更してsetg()を呼び出すので、入力パラメータは非constです。入力パラメータfoo()は変更しないでください。パラメータsetg()は非constです。 foo()の関数パラメータはconstにすることはできません。彼のユニットテストケースを越えての修正は、入力値を変更したために修正されたが、失敗した。 setg()が最初にconstを取る場合、世界はより良いものになります。
編集1のエンド

PS私は、変数名は、_gnextという名前の関数setg()の2番目のパラメータを私に感銘を受け、それが_M_in_curと呼ばれるポインタに代入され、再び機能を読んでいる間、私はほとんど私のコードを修正関数に渡す前にポインタを1にインクリメントします。誰でもパラメータを指定した人は誰でもできました。

basic_streambuf reference

あなたが得る領域が関連する入力シーケンスから文字を読み取るためのバッファである

r0nG

+0

'char_type * const'として宣言できますが、' char_type * 'に変換できないので、' char_type const * 'は動作しません。 – 0x499602D2

+0

ストリームでは、取得領域の先頭と末尾がストリームの開始点と終了点に対応していませんが、ローカルバッファの先頭と末尾に対応しています。実際には、ほとんどのストリーム実装では1つのgetバッファしか使用されないため、これらの境界は変更されませんが、ストリーム実装ではより複雑なバッファリングが使用される可能性があります。あなたの答えは –

答えて

0

を提供することができる任意の説明については、事前にありがとうございます。readメソッドが呼び出されたにもかかわらず、取得領域に十分な文字がない場合、basic_streambufオブジェクトは関連する入力シーケンスを読み取り、get領域の内容を更新します。この場合、取得領域内のコンテンツが変更されます。

+0

ありがとう。私はmakeに質問を更新しました。 AFAIU、取得領域は、関連付けられたストリームを指すポインタ3つだけです。だから、基本的に私は更新エリアの操作は、新しい場所を指すようにポインタの値を変更して取得すると信じています。 – r0ng

+0

@ r0ngとにかく、関連する入力シーケンスからこれらのポインタが指し示す場所に文字を読み込む必要があります。この操作はおそらくこれらのポインタによって行われるため、 'const char_type *'として定義することはできません。もちろん、これらのポインタではなく、他のポインタやglvaluesを介してロードを実行することもできますし、関連する入力シーケンスを直接指し示すこともできますが、標準でポインタをconst char_type *そうするための実装。あなたの背景については、私はあなたの議論をこれらのポインタとして使うのは良い考えではないと思います。 – xskxzr

関連する問題