2017-02-13 5 views
1

標準のC++ iosライブラリでは、同じstreamで呼び出されたときに&stream.iword(ind) != &stream.pword(ind)が同じindの値であることが保証されていますか?iword()とpword()は同じインデックスであることが保証されています。

さらに、void*longの値を同じインデックスで個別に使用できることが保証されていますか(つまり、ユニオンとして実装されていないなど)

ここでX-Yの問題があるとすれば、ランダムなストリームで私のカスタム値(「割り当て済み」はxalloc())が初期化されているかどうかをどのように知ることができますか?人々がpword()を使用して魔法の定数を確認した後、前の条件が失敗した場合にその値を初期化するためにiword()を使用しているのを見たので尋ねます。

私は主にC++ 11以上を気にしますが、関連する履歴情報は歓迎します。 、たとえば、その内容は時々longvoid*他の回と解釈されている単一のブロックをではなく -

+0

'pword()'を呼び出すと、 'iword()'によって返された参照は無効になります。そのため、アドレスを意味のあるものにすることはできません。興味深い@Cornstalks; – Cornstalks

+0

どのように無効にされていますか?'pword()'や 'iword()'を使うことができますが、両方を使うことはできませんか? – Qix

+0

['iword'](http://en.cppreference.com/w/cpp/io/ios_base/iword)と[' pword'](http:///en.cppreference.com/w/cpp/io/ios_base/pword)。どちらのメソッドでも、 "この参照はこの' ios_base'オブジェクト[...] "*上の操作によって無効になることがあります。いずれかを使用することはできますが、一度次の関数を呼び出すと、古い参照を破棄してそれを使用しなくてはなりません。 'std :: vector'でオブジェクトのアドレスを取るようにしてください。それは問題ありませんが、一度 'push_back'を呼び出すとそのアドレスは無効になります。 – Cornstalks

答えて

1

C++標準では、彼らはストレージ、2つの別個の、独立したブロックを操作しているかのようにiword()pword()が振る舞うべきであると述べています。

[ios.base]

namespace std { 
    class ios_base { 
    // ... 
    private: 
    long* iarray; // exposition only 
    void** parray; // exposition only 
    }; 
} 

[ios.base.storage]/3

long& iword(int idx); 

Effec ts:iarrayがNULLポインタの場合、longの配列を不定サイズに割り当て、その最初の要素へのポインタをiarrayに格納します。この関数は、必要に応じてiarrayが指す配列を、要素iarray[idx]を含むように拡張します。新たに割り当てられた配列の各要素は0に初期化されます。オブジェクトに対する他の操作の後に返される参照は無効です。しかし、ストレージの値が同じインデックスでiwordを呼び出すcopyfmtの次の呼び出しまで同じ値に別の参照を生成するように...、

[ios.base.storageを保持しているために言及しました]/5は、iwordの代わりにpwordiarrayのためにparraylongの場合はvoid*の代わりに全く同じ文言を繰り返す。

重要な部分は「記憶容量の値が保持されています」 - 指定されたインデックスの次のiwordコールでは、同じインデックスを持つ前のiwordコールで指定された値が、介入するメソッド呼び出し(copyfmt以外)にかかわらず、その介入メソッド呼び出しがpword(およびその逆)であっても、

関連する問題