
The temporary variable would not have to store the execution state of the coroutine, only the yielded value. Offering a broken postfix increment is very dangerous and should be avoided. Also, if I can’t count on InputIterator features being supported, the following is a lie: class iterator : public std::iterator< std::input_iterator_tag, typename remove_reference< R >::type > (taken from asymmetric_coroutine.hpp) -- 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 johannes.mueller-roemer@igd.fraunhofer.de | www.igd.fraunhofer.de From: Boost-users [mailto:boost-users-bounces@lists.boost.org] On Behalf Of Oliver Kowalke Sent: Monday, February 16, 2015 15:28 To: boost-users@lists.boost.org Subject: Re: [Boost-users] [context] boost::coroutines::asymmetric_coroutine<T>::pull_type iterator does not properly model InputIterator 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 <Johannes.Sebastian.Mueller-Roemer@igd.fraunhofer.de<mailto:Johannes.Sebastian.Mueller-Roemer@igd.fraunhofer.de>>: 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 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf 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): Hello,World! 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<tel:%2B49%206151%20155-606> | Fax +49 6151 155-139<tel:%2B49%206151%20155-139> johannes.mueller-roemer@igd.fraunhofer.de<mailto:johannes.mueller-roemer@igd.fraunhofer.de> | www.igd.fraunhofer.de<http://www.igd.fraunhofer.de> From: Boost-users [mailto:boost-users-bounces@lists.boost.org<mailto:boost-users-bounces@lists.boost.org>] On Behalf Of Oliver Kowalke Sent: Monday, February 16, 2015 14:20 To: boost-users@lists.boost.org<mailto:boost-users@lists.boost.org> 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 <Johannes.Sebastian.Mueller-Roemer@igd.fraunhofer.de<mailto:Johannes.Sebastian.Mueller-Roemer@igd.fraunhofer.de>>: 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 Boost-users@lists.boost.org<mailto:Boost-users@lists.boost.org> http://lists.boost.org/mailman/listinfo.cgi/boost-users