title: Is the partial specilization of const _Tp* in stl_iterator_base.h in STL necessary
body: <p>This is the code:</p>
  
  <pre><code>template &lt;class _Iter&gt;
  inline typename iterator_traits&lt;_Iter&gt;::value_type*
  __value_type(const _Iter&amp;)
  {
    return static_cast&lt;typename iterator_traits&lt;_Iter&gt;::value_type*&gt;(0);
  }
  </code></pre>
  
  <p>The function reutrn the value_type* of _Iter.</p>
  
  <p>This is the partial specilization of const _Tp*</p>
  
  <pre><code>template &lt;class _Tp&gt;
  struct iterator_traits&lt;const _Tp*&gt; {
  typedef random_access_iterator_tag iterator_category;
    typedef _Tp                         value_type;
    typedef ptrdiff_t                   difference_type;
    typedef const _Tp*                  pointer;
    typedef const _Tp&amp;                  reference;
  </code></pre>
  
  <p>};</p>
  
  <p>Is the partial specilization of const _Tp* necessary?, If we call  </p>
  
  <pre><code>__value_type(const _Iter&amp;)
  </code></pre>
  
  <p>we call </p>
  
  <pre><code>iterator_traits&lt;_Iter&gt;
  </code></pre>
  
  <p>without const actually.</p>
  
  <pre><code>iterator_traits&lt;const _Iter&gt; 
  </code></pre>
  
  <p>will never happen.</p>