title: Is it undefined behavior to `reinterpret_cast` a `T*` to `T(*)[N]`?
body: <p>Consider the following scenario:</p>
  
  <pre><code>std::array&lt;int, 8&gt; a;
  auto p = reinterpret_cast&lt;int(*)[8]&gt;(a.data());
  (*p)[0] = 42;
  </code></pre>
  
  <p>Is this <em>undefined behavior</em>? I think it is.</p>
  
  <ul>
  <li><p><code>a.data()</code> returns a <code>int*</code>, which is not the same as <code>int(*)[8]</code></p></li>
  <li><p>The <a href="http://en.cppreference.com/w/cpp/language/reinterpret_cast#Type_aliasing" rel="noreferrer">type aliasing rules</a> on <em>cppreference</em> seem to suggest that the <code>reinterpret_cast</code> is not valid</p></li>
  <li><p>As a programmer, I know that the memory location pointed by <code>a.data()</code> is an array of <code>8</code> <code>int</code> objects</p></li>
  </ul>
  
  <p>Is there any rule I am missing that makes this <code>reinterpret_cast</code> valid?</p>