On Sun, Aug 11, 2013 at 2:20 PM, Erik Olofsson <span dir="ltr"><<a href="mailto:erik.olofsson@hansoft.se" target="_blank">erik.olofsson@hansoft.se</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
  How would DR1484 interact with function return type deduction. Would this still not require the patch?<br></blockquote><div><br></div><div>This is a great question and example. We decided to keep DR1484 open so we could consider the interaction with generic lambdas you point out below. However, I think there's only one reasonable resolution.</div>
<div><br></div><div>Consider a generic lambda with a capture-default:</div><div><br></div><div>void g(int);</div><div>template<typename T> void g(const T&);</div><div>template<typename T> auto f() {</div><div>
  const T n = 0;</div><div>  return [=] (auto x) { g(n); };</div><div>}</div><div><br></div><div>The behavior we want is that the lambda captures the same set of entities it would have captured if we had manually substituted the template parameter for its argument. So:</div>
<div><br></div><div> * f<float>'s returned lambda implicitly captures the local variable 'n'.</div><div> * f<int>'s returned lambda does not implicitly captures the local variable 'n', because 'g(n)' is a non-dependent expression that does not odr-use 'n' (because 'n' is a constant expression to which an lvalue-to-rvalue conversion is immediately applied).</div>
<div><br></div><div>In order to determine this, we *must* instantiate the lambda's body when instantiating f<T>.</div><div><br></div><div>Another example that needs eager instantiation of generic lambda bodies:</div>
<div><br></div><div>template<typename T> void f() { [] () { T::error; }; } // f<int> is ill-formed</div><div>template<typename T> void g() { [] (auto) { T::error; }; } // g<int> should be ill-formed too</div>
<div><br></div><div>If we eagerly instantiate all generic lambdas, then we never need to refer back into f<T>'s LocalInstantiationScope when instantiating the lambda's call operator template, so this patch is not needed.</div>
</div>