2011-10-17 6 views
4

私は独自の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))を指定するための標準の根拠を知っている人はいますか?もしそうでなければ、それはもっともらしい理論的根拠を想像することができますか?

+1

以下の段落は、[fpos.operations]セクションにあります。traits :: pos_type型の値を返すストリーム操作は、無効な値としてP(O(-1))を返し、 はエラーを通知します。この値がistream、ostream、またはstreambufメンバの引数として使用され、 がtraits :: pos_type型の値を受け入れる場合、その関数の動作は未定義です。 ---おそらく、私が理解している唯一の部分は、セクションの残りの部分を理解することができます。 – Patrick

+0

@Patrick:はい、その部分は確かに鍵です。 (受け入れられた答えとそこに私のコメントを参照してください。)ありがとう! – Nemo

答えて

4

私は、デフォルトでpos_typeは、一般的にこのように定義されstd::streamposに沸くことを信じて:

typedef fpos<mbstate_t> streampos;

std::fpos通常のオフセットマルチバイトの状態オブジェクトと組み合わされます。

また、デフォルトでoff_typeも符号付き整数型(longまたはそのようなもの)であるstd::streamoffに煮詰めるます

だから私はここに考え方があなたとオフセット型を初期化することができるということです考えるセンチネル-1の値を使用すると、より複雑なオブジェクトである位置オブジェクトを初期化するために使用できます。 のコンストラクタはlongではなくstreamoffタイプを取るので、streamofflongなどより複雑な型になる可能性があるので、慎重にする必要があります。何の暗黙の変換はないだろうので

struct streamoff { 
    explicit streamoff(long offset); 
    // rest of the stuff here... 
}; 

それからちょうどpos_type(-1)は機能しません。

streamoffは、このように定義された実装を想像してみてください。

だから私はそれがちょうど慎重であると思う。

+0

ありがとうございました。私は 'streampos'が構造体になりうることに気づいていませんでした。しかし、 'off_type'が符号付き整数型の場合、-1に初期化しても「最大値」は得られません。 (実際には、 'off_type'が符号付き整数型の場合、' streampos'が構造体であっても、 'off_type(-1)'と実際には '-1'とは違うかもしれません) – Nemo

+0

申し訳ありませんが、それは最大ではない、私は私の答えを修正します。 –

+0

ああ、そうだ。これらの型は整数である必要はまったくありません。表88(セクション27.4.3.2、[lib.fpos.operations])に記載されている要件に従うことのみが要求されます。だから両方が構造物になることができます。それは私の質問に答えます。ありがとう! – Nemo