2017-12-28 5 views
1

C++ Primer에 주어진 foll 코드가 올바르지 않습니까?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; 

후위 연산자가 좌변 역할을 할 수있는 방법을 다음 이전 값이 아닌 참조를 반환? 첫째

*(out_iter++) = e; 

그래서 후위 증가 일이 발생하고 역 참조가 수행됩니다

*out_iter++ = e; 

이 같다 : 나는

+0

'out_iter ++'는 좌변 값이 아닙니다. iterator rvalue입니다. '* out_iter ++'는 lvalue입니다. –

+0

운영자 우선 순위를 잘못 읽고 있습니다. '* out_iter ++'는'(* out_ptr) ++'이 아니라'* (out_iter ++) '를 의미합니다. –

+0

@ n.m. 확실합니까? 내가 볼 수있는 한,'out_iter ++ '도 역시 lvalue입니다. –

답변

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입니다 잘못 생각하는 경우

은 수정하십시오. operator++에서

:

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

는 아무것도 실행하지 않습니다. 기본 스트림에 값을 출력 (삽입)하려면 * iter ++ = value 및 * ++ iter = value 표현식을 사용할 수 있습니다.

반환 값

*

operator*에서이 : 그것은 가능 등 * ITER = 같은 코드 를 사용할 수있게 반복자 자체를 반환

ostream_iterator& operator*(); 

값을 사용하여 기본 스트림 인 스트림에 값을 출력 (삽입)합니다.

반환 값

*이

는 기본적으로, 반복자 자체 *(out_iter++) 복귀 참조 하나 *(out_iter++) = value 형태의 스트림에 기록 할 수 있도록한다는 것을 의미한다.