title: new-expression and delete-expression on const reference and const pointer
body: <p><strong>C++</strong></p>
  
  <p>Much literature says <code>const</code> references cannot be used to modify their referents and <code>const</code> pointers cannot be used to modify their pointees.</p>
  
  <p>Then, why can they be <code>delete</code>d?</p>
  
  <pre><code>const int&amp; cirDynamic = *( new int(5) );
  // ^ 'const int&amp; cirDynamic = *( &amp;( *( new int(5) ) ) );' gives same output below
  cout &lt;&lt; cirDynamic &lt;&lt; endl; // 5
  delete &amp;cirDynamic;
  cout &lt;&lt; cirDynamic &lt;&lt; endl; // garbage value
  </code></pre>
  
  <p>I know the trailing const in <code>T* const</code> only prevents the pointer from being reseated, but below I use two <code>const</code>s, as in <code>const T* const</code>, for emphasis. Why can the following pointer be <code>delete</code>d?</p>
  
  <pre><code>const int* const cipcDynamic =  new int(5);
  // ^ 'const int* const cipcDynamic = &amp;( *( new int(5) ) );' gives same output below
  cout &lt;&lt; *cipcDynamic &lt;&lt; endl; // 5
  delete cipcDynamic;
  cout &lt;&lt; *cipcDynamic &lt;&lt; endl; // garbage value
  </code></pre>
  
  <p>The output shows that at least some dynamically allocated memory was freed. Has all of it been freed, or could there have been copying involved where only the copy was freed?</p>
  
  <p>The non-const version of the const reference snippet (<code>int&amp;</code>) and the non-leading-const versions of the const pointer const snippet (<code>int* const</code> and <code>int*</code>) produce the same output as their more const counterparts. In all 5 cases, why and how is the lifetime of the temporary new-expression extended?</p>
  
  <p>Assuming the corresponding operator has not been overloaded, explicitly deleted, or made non-public if the data type is a class or struct, does the Standard make the following guarantees:</p>
  
  <ul>
  <li><p>The dereference operator provides direct access to the pointee</p></li>
  <li><p>The <code>new</code> operator produces a pointer to the dynamically allocated memory, not a dynamically allocated copy of the original dynamically allocated memory</p></li>
  </ul>
  
  <p>If instead the <code>new</code> operator was overloaded but still returned <code>::operator new(size)</code> and the dereference operator was overloaded but still returned a reference to the object, are there any side-effects that would make these two points not hold?</p>