title: Throwing an rvalue
body: <p>Consider the fragment:</p>
  
  <pre><code>try {
      Foo f;
      throw std::move(f);
  }
  catch (Foo&amp; f) { }
  </code></pre>
  
  <p>[expr.throw] says that:</p>
  
  <blockquote>
    <p>the type of the exception object
    is determined by removing any top-level <em>cv-qualifiers</em> from the static type of the operand and adjusting the
    type from “array of T” or “function returning T” to “pointer to T” or “pointer to function returning T”,
    respectively.</p>
  </blockquote>
  
  <p>which would be <code>Foo&amp;&amp;</code>. The exception object is then initialized according to [except.throw]:</p>
  
  <blockquote>
    <p>Throwing an exception copy-initializes (8.5, 12.8) a temporary object, called the <em>exception object</em>. The
    temporary is an lvalue and is used to initialize the variable declared in the matching <em>handler</em> (15.3). If the
    type of the exception object would be an incomplete type or a pointer to an incomplete type other than
    (possibly cv-qualified) <code>void</code> the program is ill-formed.</p>
  </blockquote>
  
  <p>This suggests to me that the exception object is initialized as:</p>
  
  <pre><code>Foo&amp;&amp; __exception_object = std::move(f);
  </code></pre>
  
  <p>and that the handler would not match. However, both gcc and clang do catch this exception. So what's the actual type of the exception object here? If <code>Foo</code>, why?</p>