title: initializer_list and template type deduction
body: <p>Consider the function:</p>
  
  <pre><code>template&lt;typename T&gt;
  void printme(T&amp;&amp; t) {
    for (auto i : t)
      std::cout &lt;&lt; i;
  }
  </code></pre>
  
  <p>or any other function that expects one parameter with a begin()/end() - enabled type.</p>
  
  <p><strong>Why is the following illegal?</strong></p>
  
  <p><code>printme({'a', 'b', 'c'});</code></p>
  
  <p>When all these are legitimate:</p>
  
  <pre><code>printme(std::vector&lt;char&gt;({'a', 'b', 'c'}));
  printme(std::string("abc"));
  printme(std::array&lt;char, 3&gt; {'a', 'b', 'c'});
  </code></pre>
  
  <p>We can even write this:</p>
  
  <pre><code>const auto il = {'a', 'b', 'c'};
  printme(il);
  </code></pre>
  
  <p>or</p>
  
  <pre><code>printme&lt;std::initializer_list&lt;char&gt;&gt;({'a', 'b', 'c'});
  </code></pre>