title: Why and when is cast to char volatile& needed?
body: <p>In <a href="https://svn.boost.org/trac/boost/browser/trunk/boost/utility/addressof.hpp#L37" rel="noreferrer">boost::detail::addressof_impl::f()</a> a series of <code>reinterpret_cast</code>s is done to obtain the actual address of the object in case <code>class T</code> has overloaded <code>operator&amp;()</code>:</p>
  
  <pre><code>template&lt;class T&gt; struct addressof_impl
  {
      static inline T* f( T&amp; v, long )
      {
          return reinterpret_cast&lt;T*&gt;(
              &amp;const_cast&lt;char&amp;&gt;(reinterpret_cast&lt;const volatile char&amp;&gt;(v)));
      }
  }
  </code></pre>
  
  <p>What's the purpose of cast to <code>const volatile char&amp;</code> instead of just casting to <code>char&amp;</code>?</p>