私は独自のstreambuf
サブクラスを作成しており、C++ 03仕様(ISO/IEC 14882:2003)を参考にしています。セクション27.5.2.4.2 [lib.streambuf.virt.buffer]でC++ 03の奇妙さseekoff()とseekpos()の仕様
、両方basic_streambuf::seekoff()
とbasic_streambuf::seekpos()
の仕様は言う:
デフォルトの動作:返しpos_type(off_type(-1)) 。
今、私はoff_type
が符号付き整数型になるはずだった、それはこの表現がちょうどpos_type(-1)
と同等である必要があります私には思えるようpos_type
は、符号なし整数型になるはずだったと思いました。
私は間違っていると仮定し、これらの型は符号付きと符号なしの他の組み合わせかもしれません...そして、私はまだこの二重キャストの可能性のある使用を理解することはできません。
たとえば、両方が署名されている場合、再び式はpos_type(-1)
に相当します。
pos_type
は署名とoff_type
は、符号なしであった場合は - 意味がありませんが、私と一緒に負担している - そして、最高の状態で、この二重のキャストはpos_type
にいくつかの巨大な値を突き出すなり、最悪の場合、それは割り当てることによって、処理系定義の動作を呼び出します。符号付きのpos_type
整数には大きすぎます。
ここでの代わりにpos_type(off_type(-1))
を指定するための標準の根拠を知っている人はいますか?もしそうでなければ、それはもっともらしい理論的根拠を想像することができますか?
以下の段落は、[fpos.operations]セクションにあります。traits :: pos_type型の値を返すストリーム操作は、無効な値としてP(O(-1))を返し、 はエラーを通知します。この値がistream、ostream、またはstreambufメンバの引数として使用され、 がtraits :: pos_type型の値を受け入れる場合、その関数の動作は未定義です。 ---おそらく、私が理解している唯一の部分は、セクションの残りの部分を理解することができます。 – Patrick
@Patrick:はい、その部分は確かに鍵です。 (受け入れられた答えとそこに私のコメントを参照してください。)ありがとう! – Nemo