coroutines behave different than ordinary containers - even a temp var, created inside iterator::operator++( int), will influence the state of the attached coroutine (increment operator)
you can't count on the feature set described for input iterators in the standard

2015-02-16 15:00 GMT+01:00 Mueller-Roemer, Johannes Sebastian <>:

If that is „as expected“ it still violates the requirements for an InputIterator. See the last row in Table 107 in 24.2.3 in the standard

As-is the current “iterator” is not a valid iterator of any kind as InputIterator is already the weakest requirement.


Example of how it should work (using an istream_iterator, which is an InputIterator):

#include <iostream>

#include <sstream>

#include <iterator>


auto main(int, char **) -> int


      std::istringstream str("Hello , World !");

      for(auto it = std::istream_iterator<std::string>(str); it != std::istream_iterator<std::string>();)

            std::cout << *it++;

      std::cout << "\n";



Which outputs (as expected):



The issue can be solved by storing a value in the iterator or returning a proxy object which dereferences to the original value.


Johannes S. Mueller-Roemer, MSc

Wiss. Mitarbeiter - Interactive Engineering Technologies (IET)


Fraunhofer-Institut für Graphische Datenverarbeitung IGD

Fraunhoferstr. 5  |  64283 Darmstadt  |  Germany

Tel +49 6151 155-606  |  Fax +49 6151 155-139  |


From: Boost-users [] On Behalf Of Oliver Kowalke
Sent: Monday, February 16, 2015 14:20
Subject: Re: [Boost-users] [context] boost::coroutines::asymmetric_coroutine<T>::pull_type iterator does not properly model InputIterator


2015-02-16 13:46 GMT+01:00 Mueller-Roemer, Johannes Sebastian <>:

Compiling is not the issue.


it works as expected


Furthermore your example does not test the issue I mentioned, as it does not use *it++;


operator++ has higher precedence than operator* -> each increment triggers an jump/switch operation -> last increment invalidates coroutine


Boost-users mailing list