[過去ログ] Boostを語れゴラァ part4 (1001レス)
前次1-
抽出解除 レス栞

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
949
(1): デフォルトの名無しさん [sage] 2007/10/17(水) 23:03:33 AAS
>948
都合により直接メンバアクセスすることはできない。ただし、A& に変換することはできる。
ということで、不格好だけど、static_cast<A&)(p2[0]).a みたいにするか、long& getA(A& a) { return a.a; } を作って getA(p2[0]) みたいにする必要がある。

コメントの部分はこういうことだと思う。

p2[n] が A& を直接返していたとする。
この時返ってくる A& は *(p2 + n) の結果なんだけど、 p2 + n は iterator の一時オブジェクトで既に破棄されていることになる。
iterator によっては自分が破棄された場合に、指し先(この場合返ってきた A&)も無効化するものがあるかもしれない。
ということで、p2 + n に対応する iterator が存在することを保証するために proxy オブジェクトが使用されている。
950
(2): デフォルトの名無しさん [sage] 2007/10/18(木) 01:17:26 AAS
>>949
あー、なるほど。
分かりやすい解説ありがとうございます。

確かに、さっきのp2で
cout << (*(p2 + 5)).a << endl;
って添え字演算子と同じことをやると、Visual Studio がアサート失敗を出す。
vectorのイテレータが破棄されちゃうのね…。

>>948は例のためにvector使ったんで、
実は本当にtransform_iterator使いたいのはポインタだからこの問題は起こらない…。
transform_iteratorを継承してoperator[]を隠蔽してみます。
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.033s