<div dir="ltr">Would it be helpful to focus on small well-defined cases where auto makes sense, and progressively grow that list as we see fit?<div><br></div><div><br></div><div>e.g. I think this is great:</div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><font face="monospace, monospace">auto ptr = std::make_unique&lt;Foo&gt;(bar);</font></div></blockquote><div>Proposed rule: if the type is obvious because it&#39;s on the line, then auto is good.</div><div>Similarly:</div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><font face="monospace, monospace">auto i = static_cast&lt;int&gt;(j);</font></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><font face="monospace, monospace">auto foo = make_foo();</font></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><font face="monospace, monospace">auto bar = something.get_bar(); // Sometimes, &quot;bar&quot; is obvious.</font></div></blockquote><div><br></div><div><br></div><div>Range-based loops are a bit tricky. IMO containers with &quot;simple&quot; types are good candidates for either:</div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><font face="monospace, monospace">for (const auto&amp; v : cont) { /* don&#39;t change v */ }</font></div><div><font face="monospace, monospace">for auto&amp; v : cont) { /* change v */ }</font></div></blockquote><div>But what&#39;s &quot;simple&quot;? I&#39;d say all numeric, pointer, and string types at least. It gets tricky for more complex types, and I&#39;d often rather have the type in the loop. <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3853.htm">Here&#39;s more discussion on this</a>, including a recommendation to use <font face="monospace, monospace">auto&amp;&amp;</font> on range-based loops! I think this gets confusing, and I&#39;m not a huge fan of r-value references everywhere.</div><div><br></div><div><br></div><div>Here&#39;s another I like, which Yusuke pointed out a while ago (in ES6 Module&#39;s implementation?):</div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><font face="monospace, monospace">struct Foo {</font></div><div><font face="monospace, monospace">  typedef Something Bar;</font></div><div><font face="monospace, monospace">  // ...</font></div><div><font face="monospace, monospace">  Bar doIt();</font></div><div><font face="monospace, monospace">};</font></div><div><font face="monospace, monospace">auto Foo::doIt() -&gt; Bar</font></div><div><font face="monospace, monospace">{</font></div><div><font face="monospace, monospace">  // ...</font></div><div><font face="monospace, monospace">}</font></div></blockquote><div>Why? Because <font face="monospace, monospace">Bar</font> is scoped to <font face="monospace, monospace">Foo</font>! It looks odd the first time, but I think this is idiomatic &quot;modern&quot; C++.</div><div><br></div><div><br></div><div>I also like creating unnamed types, though I know this isn&#39;t everyone&#39;s liking:</div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><font face="monospace, monospace">auto ohMy()</font></div><div><font face="monospace, monospace">{</font></div><div><font face="monospace, monospace">  struct { int a; float b; } result;</font></div><div><font face="monospace, monospace">  // ...</font></div><div><font face="monospace, monospace">  return result;</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace">void yeah()</font></div><div><font face="monospace, monospace">{</font></div><div><font face="monospace, monospace">  auto myMy = ohMy();</font></div><div><font face="monospace, monospace">  dataLogLn(myMy.a, myMy.b);</font></div><div><font face="monospace, monospace">}</font></div></blockquote><div>I initially had that with <a href="https://github.com/WebKit/webkit/blob/master/Source/WTF/wtf/Atomics.h#L385">consumeLoad</a>, which returns a <font face="monospace, monospace">T</font> as well as a <font face="monospace, monospace">ConsumeDependency</font>. I couldn&#39;t care less about the container for <font face="monospace, monospace">T</font> and <font face="monospace, monospace">ConsumeDependency</font>, I just want these two values.</div></div>