<div dir="ltr">The auto&& is really confusing.<div><br></div><div>-kurt</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Apr 10, 2018 at 2:41 PM, Mateusz Loskot <span dir="ltr"><<a href="mailto:mateusz@loskot.net" target="_blank">mateusz@loskot.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 10 April 2018 at 23:06, Even Rouault <<a href="mailto:even.rouault@spatialys.com">even.rouault@spatialys.com</a>> wrote:<br>
> On mardi 10 avril 2018 22:34:56 CEST Mateusz Loskot wrote:<br>
>> On 10 April 2018 at 22:06, Even Rouault <<a href="mailto:even.rouault@spatialys.com">even.rouault@spatialys.com</a>> wrote:<br>
>> ><br>
</span><span class="">>> > Just wanted to advertize the recent new introduction of C++ iterators<br>
>> > (...)<br>
>><br>
>> Good one, thanks!<br>
>><br>
>> >     for( auto&& poLayer: poDS->GetLayers() )<br>
>><br>
>> Do the iterators return a proxy reference hence the tutorial prefers<br>
>> auto&& over plain auto&?<br>
>> (ie. like std::vector<bool> iterator does)<br>
><br>
> Not completely sure to understand what a proxy reference is (C++11 stuff is<br>
> still very new to me, and I don't pretend to master C++98, so ...), but I feel<br>
> that must be close to what I have used in some cases, particularly wen<br>
> iterating over fields of a features, or points of a linestring.<br>
<br>
</span>I didn't look at the iterators impl. yet.<br>
I just looked at your example and wondered if there are proxies<br>
- for GDAL/OGR, those could be necessary, I imagine.<br>
<br>
I mean a proxy as an object that 'looks' like a reference.<br>
It's often necessary to for (proxied) collections of objects that can not be<br>
accessed directly, via regular pointers/references.<br>
<span class=""><br>
> I read in some tutorial that using auto&& worked in all situations, including<br>
> when the returned reference was const, so now I just use that everywhere.<br>
<br>
</span>auto&& is most useful when container<T>::reference returns a proxy object,<br>
which would not bind to auto& (it would bind to auto const& though).<br>
<span class=""><br>
> In fact the nature of the object which is returned depends on the iterator,<br>
> and as documented in the API, for the sake of implementation simplicity, those<br>
> iterators do not necessarily respect the whole semantics of iterators.<br>
><br>
> That is if you do<br>
><br>
> auto iter = poLineString->begin();<br>
> OGRPoint& oPoint = *iter;<br>
> ++iter;<br>
> OGRPoint& oAnotherPoint = *iter;<br>
> In fact &oAnotherPoint == &oPoint.<br>
<br>
</span>At first, it seems like they model the input iterators, single-pass<br>
iterator category<br>
<a href="http://en.cppreference.com/w/cpp/concept/InputIterator" rel="noreferrer" target="_blank">http://en.cppreference.com/w/<wbr>cpp/concept/InputIterator</a><br>
<span class=""><br>
> So basically you should only use them in range based loops, where you don't<br>
> really manipulate the iterator and cannot do stuff like the above.<br>
<br>
</span>Or, use like any input iterators, seems safe.<br>
<span class=""><br>
> I guess the "correct" solution would have been to return a OGRPointProxy that<br>
> would keep a link to the linestring and the point index. But not sure how you<br>
> would do that for a const iterator where the operator * is supposed to<br>
> returned a const reference...<br>
<br>
</span>Or reference-like proxy like std::vector<bool> does.<br>
<span class="im HOEnZb"><br>
Best regards,<br>
--<br>
Mateusz Loskot, <a href="http://mateusz.loskot.net" rel="noreferrer" target="_blank">http://mateusz.loskot.net</a><br>
</span><div class="HOEnZb"><div class="h5">______________________________<wbr>_________________<br>
gdal-dev mailing list<br>
<a href="mailto:gdal-dev@lists.osgeo.org">gdal-dev@lists.osgeo.org</a><br>
<a href="https://lists.osgeo.org/mailman/listinfo/gdal-dev" rel="noreferrer" target="_blank">https://lists.osgeo.org/<wbr>mailman/listinfo/gdal-dev</a></div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature">--<div><a href="http://schwehr.org" target="_blank">http://schwehr.org</a></div></div>
</div>