title: Syntax for universal references
body: <p>This is an rvalue reference:</p>
  
  <pre><code>void foo(int&amp;&amp; a);
  </code></pre>
  
  <p>It does not bind to lvalues:</p>
  
  <pre><code>int i = 42;
  foo(i);   // error
  </code></pre>
  
  <p>This is a universal reference:</p>
  
  <pre><code>template&lt;typename T&gt;
  void bar(T&amp;&amp; b);
  </code></pre>
  
  <p>It binds to rvalues and it also binds to lvalues:</p>
  
  <pre><code>bar(i);   // okay
  </code></pre>
  
  <p>This is an rvalue reference:</p>
  
  <pre><code>template&lt;typename T&gt;
  struct X
  {
      void baz(T&amp;&amp; c);
  };
  </code></pre>
  
  <p>It does not bind to lvalues:</p>
  
  <pre><code>X&lt;int&gt; x;
  x.baz(i);   // error
  </code></pre>
  
  <p>Why do universal references use the same syntax as rvalue references? Isn't that an unnecessary source of confusion? Did the committee ever consider alternative syntaxes like <code>T&amp;&amp;&amp;</code>, <code>T&amp;*</code>, <code>T@</code> or <code>T&amp;42</code> (just kidding on that last one)? If so, what were the reasons for rejecting alternative syntaxes?</p>