title: Why doesn't `auto &&` behave as a so-called "universal reference" when used as a lambda argument
body: <p>Why does the <code>&amp;&amp;</code> argument type in the following example not behave as a so-called &quot;universal reference&quot; even though it seems to be in a &quot;deduced context&quot;, and instead is interpreted as an r-value:</p>
  <pre><code>auto main() -&gt; int {    
      using MyFn = void (*)(int &amp;);    
      MyFn special = [](auto &amp;&amp; thing) {};  // compile error, deduced as int &amp;&amp; rather than int&amp;
      
      return 0;    
  }
  </code></pre>
  <p>Whereas the following, which I expect to be equivalent, does work?</p>
  <pre><code>template &lt;typename T&gt; void foo(T &amp;&amp;){};
  
  auto main() -&gt; int {
      using MyFn = void (*)(int &amp;);
      MyFn specialC = foo;
      return 0;
  }
  </code></pre>
  <p>I suspect there's some esoteric detail with converting lambdas to function pointers that matters here, but so far I can't figure it out.</p>