
On Oct 2, 2013, at 1:57 PM, Nathan Ridge <zeratul976@hotmail.com> wrote:
I noticed today that code of this form does not compile:
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, Node, Edge> Graph; typedef boost::graph_traits<Graph>::vertex_descriptor Vertex; typedef boost::graph_traits<Graph>::edge_descriptor Edge; Graph graph = ...; Vertex vertex = ...; for (Edge edge: boost::out_edges(vertex, graph)) {...}
The reason is that out_edges returns a std::pair of iterators. This is a valid range in the sense of boost.range, and so is compatible with BOOST_FOREACH. However, this is not a valid range in the sense of c++11 range-based-for.
It's not clear whether this can easily be changed. In a perfect world these functions should probably return something like boost::iterator_range which would be compatible with both boost- and language-level concepts of range-ness. However, the graph documentation explicitly names the return types of out_edges et. al. (see [1]) as std::pairs, which eliminates some wiggle room. Is there an alternate way to address this?
Sadly, I don't think there s a way of turn an std::pair of iterators into a range-based-for-compliant range (see [1]).
So, I think that if Boost.Range wants to interoperate with standard ranges, it will need to deprecate std::pair of iterators as a range, and dependent libraries will need to follow suit.
Regards, Nate
[1] http://stackoverflow.com/questions/6167598/why-was-pair-range-access-removed...
Actually, it's pretty simple: http://cplusplusmusings.wordpress.com/2013/04/14/range-based-for-loops-and-p... -- Marshall Marshall Clow Idio Software <mailto:mclow.lists@gmail.com> A.D. 1517: Martin Luther nails his 95 Theses to the church door and is promptly moderated down to (-1, Flamebait). -- Yu Suzuki