 <p>The relevant section in the standard is 5.2.10 [expr.reinterpret.cast]. There are two relevant paragraphs:</p> <p>First, there is paragraph 1 which ends in:</p> <blockquote> <p>No other conversion can be performed explicitly using reinterpret_cast.</p> </blockquote> <p>... and paragraph 11 as none of the other apply:</p> <blockquote> <p>A glvalue expression of type <code>T1</code> can be cast to the type “reference to <code>T2</code>” if an expression of type “pointer to <code>T1</code>” can be explicitly converted to the type “pointer to <code>T2</code>” using a <code>reinterpret_cast</code>. The result refers to the same object as the source glvalue, but with the specified type. [ Note: That is, for lvalues, a reference cast <code>reinterpret_cast&lt;T&amp;&gt;(x)</code> has the same effect as the conversion <code>*reinterpret_cast&lt;T*&gt;(&amp;x)</code> with the built-in <code>&amp;</code> and <code>*</code> operators (and similarly for <code>reinterpret_cast&lt;T&amp;&amp;&gt;(x))</code>. —end note ] No temporary is created, no copy is made, and constructors (12.1) or conversion functions (12.3) are not called.</p> </blockquote> <p>All the other clauses don't apply to objects but only to pointers, pointers to functions, etc. Since an rvalue is not a glvalue, the code is illegal.</p>