2017-12-28 5 views
1

C++ Primerで指定されたフォールドコードが正しくありませんか?ostream_iteratorに適用すると、後置演算子はlvalueを返しますか?

ostream_iterator<int> out_iter(cout, " "); 
for (auto e : vec) 
    *out_iter++ = e; // the assignment writes this element to cout 
cout << endl; 

postfix演算子は、参照ではなく古い値を返します。次に、左辺値としてどのように動作させることができますか?

私が間違って

+0

'out_iter ++'は左辺値ではありません。 iteratorの値です。 '* out_iter ++'は左辺値です。 –

+0

演算子の優先順位が誤っています。 '* out_iter ++'は '(* out_ptr)++'ではなく '*(out_iter ++)'を意味します。 –

+0

@ n.m。本気ですか?私が見る限り、 'out_iter ++'も同様に左辺値です。 –

答えて

1

)(++ http://en.cppreference.com/w/cpp/iterator/ostream_iterator/operator_arith

ostream_iterator &オペレータを参照するためによれ。

ostream_iterator &演算子++(int);

が、演算子*とostream_iteratorの演算子++何もしないが、彼らは唯一の*thisへの参照を返すので、あなたがこの

for (auto e : vec) 
    out_iter = e; // the assignment writes this element to cout 

を書くことができ、出力は同じになります。

1

だかのようにコードがOKで修正してください:

*out_iter++ = e; 

に等しいです:

*(out_iter++) = e; 

ので、後置インクリメントは最初にして間接参照が実行されると発生します。 operator++から

ostream_iterator& operator++(); 
ostream_iterator& operator++(int); 

は何もしません。 これは、式* iter ++ = valueと * ++ iter = valueを使用して、値を基になるストリームに出力(挿入)することを可能にします。

戻り値

*

operator*からこの:それは可能な* ITER =としてコード を使用できるようになり反復子自体を、返し

ostream_iterator& operator*(); 

値を基底の ストリームに出力(挿入)します。

戻り値

*この

基本的に、それは1つが*(out_iter++) = valueの形でストリームに書き込むことができるよう*(out_iter++)は反復子自体への参照を返すことを意味します。

関連する問題