Stroustrop explains his reasoning for the auto keyword here:<p><a href="http:&#x2F;&#x2F;www.stroustrup.com&#x2F;C++11FAQ.html#auto" rel="nofollow">http:&#x2F;&#x2F;www.stroustrup.com&#x2F;C++11FAQ.html#auto</a><p><pre><code>  The use of auto to deduce the type of a variable from its initializer is 
  obviously most useful when that type is either hard to know exactly or hard to
  write. Consider:
  
  template&lt;class T&gt; void printall(const vector&lt;T&gt;&amp; v)
  {
     for (auto p = v.begin(); p!=v.end(); ++p)
        cout &lt;&lt; *p &lt;&lt; &quot;\n&quot;;
  }
  
  In C++98, we&#x27;d have to write
  
  template&lt;class T&gt; void printall(const vector&lt;T&gt;&amp; v)
  {
      for (typename vector&lt;T&gt;::const_iterator p = v.begin(); p!=v.end(); ++p)
          cout &lt;&lt; *p &lt;&lt; &quot;\n&quot;;
  }
  
  When the type of a variable depends critically on template argument it can be
  really hard to write code without auto. For example:


  template&lt;class T, class U&gt; void multiply(const vector&lt;T&gt;&amp; vt, const vector&lt;U&gt;&amp; vu)
  {
      &#x2F;&#x2F; ...
      auto tmp = vt[i]*vu[i];
      &#x2F;&#x2F; ...
  }</code></pre>