<div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">On Wed, Aug 2, 2017 at 2:39 AM George Rimar <<a href="mailto:grimar@accesssoftek.com">grimar@accesssoftek.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" style="font-size:12pt;color:#000000;background-color:#ffffff;font-family:Calibri,Arial,Helvetica,sans-serif">
<p><span style="color:rgb(33,33,33);font-size:12pt">>I suppose for a range algorithm (as opposed to a range adapter) you probably just need to take by T & (and T will be deduced to const U if needed).</span><br>
</p>
<p><br>
</p>
</div><div dir="ltr" style="font-size:12pt;color:#000000;background-color:#ffffff;font-family:Calibri,Arial,Helvetica,sans-serif"><p>Thanks David !<br>
</p>
<p><br>
</p>
<p>I would suggest to use next signature for <span style="color:rgb(33,33,33);font-family:Calibri,Arial,Helvetica,sans-serif;font-size:16px;background-color:rgb(255,255,255)">parallelForEach in LLD then:</span><br>
</p>
<p><span style="color:rgb(33,33,33);font-family:Calibri,Arial,Helvetica,sans-serif;font-size:16px;background-color:rgb(255,255,255)">template <typename R, class FuncTy> void parallelForEach(const R &Range, FuncTy Fn) <br>
</span></p>
<p><span style="color:rgb(33,33,33);font-family:Calibri,Arial,Helvetica,sans-serif;font-size:16px;background-color:rgb(255,255,255)"><br>
</span></p>
<p><span style="color:rgb(33,33,33);font-family:Calibri,Arial,Helvetica,sans-serif;font-size:16px;background-color:rgb(255,255,255)">Because  without `const` for `Range` next call would report warnings:</span></p>
<p><span style="color:rgb(33,33,33);font-family:Calibri,Arial,Helvetica,sans-serif;font-size:16px;background-color:rgb(255,255,255)">parallelForEach(std::vector<int>({ 1, 2 }), [](int) {});</span></p>
<div>warning C4239: nonstandard extension used: 'argument': conversion from 'std::vector<int,std::allocator<int>>' to 'std::vector<int,std::allocator<int>> &'</div>
<div>note: A non-const reference may only be bound to an lvalue.<br>
</div>
<div><br>
</div>
<div>I know we do not use such calls in LLD, but if one day LLVM's algorithms be changed from && to &,<br>
</div>
<div>I think it worth to use const fo them and therefore for LLD algorithms too.<br></div></div></blockquote><div><br></div><div>Oh, huh, yeah - right you are (I was rather hoping that "T&" would derive T as "const U" when passed a temporary, but as you've pointed out, it doesn't).<br><br>Yeah, I'd be in favor of what you've done then - passing T&& so temporaries or locals can be passed by reference without undue copying in either case.<br><br>- Dave</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" style="font-size:12pt;color:#000000;background-color:#ffffff;font-family:Calibri,Arial,Helvetica,sans-serif"><div>
</div></div><div dir="ltr" style="font-size:12pt;color:#000000;background-color:#ffffff;font-family:Calibri,Arial,Helvetica,sans-serif">
<div><br>
</div>
<div>George.<br>
</div>
<p><span style="color:rgb(33,33,33);font-family:Calibri,Arial,Helvetica,sans-serif;font-size:16px;background-color:rgb(255,255,255)"><br>
</span></p>
</div></blockquote></div></div>