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にインクリメントします。誰でもパラメータを指定した人は誰でもできました。
あなたが得る領域が関連する入力シーケンスから文字を読み取るためのバッファである
r0nG
'char_type * const'として宣言できますが、' char_type * 'に変換できないので、' char_type const * 'は動作しません。 – 0x499602D2
ストリームでは、取得領域の先頭と末尾がストリームの開始点と終了点に対応していませんが、ローカルバッファの先頭と末尾に対応しています。実際には、ほとんどのストリーム実装では1つのgetバッファしか使用されないため、これらの境界は変更されませんが、ストリーム実装ではより複雑なバッファリングが使用される可能性があります。あなたの答えは –