title: Including std::forward yield an error, but its omission compiles. Why?
body: <p>I think I'm fundamentally misunderstanding something about std::forward. Take a look at the following code - if I include std::forward, it won't compile, but if it's omitted, it compiles fine. Isn't the point of std::forward that it can deduce if it's needed to push a l or rvalue?</p>
  
  <pre><code>#include "boost/optional.hpp"
  #include "iostream"
  template&lt;typename T&gt;
  bool hasArg(const boost::optional&lt;T&gt;&amp; opts)
  {
      if (opts)
      {
          return true;
      }
      else
      {
          return false;
      }
  }
  
  
  template&lt;typename T, typename ... Ts&gt;
  bool hasArg(const boost::optional&lt;T&gt; &amp; opts,const boost::optional&lt;Ts&gt; &amp; ... rest)
  {
      if (opts) {
          //doesn't work: return hasArg&lt;Ts...&gt;(std::forward&lt;Ts&gt;(rest)...);
          //works: return hasArg&lt;Ts...&gt;(rest...);
          return hasArg&lt;Ts...&gt;(rest...);
      }
      else
      {
          return false;
      }
  }
  
  
  int main()
  {
      const boost::optional&lt;int&gt; p = boost::optional&lt;int&gt;(5);
      const boost::optional&lt;int&gt; q = boost::optional&lt;int&gt;(6);
      std::cout &lt;&lt; hasArg(p, q) &lt;&lt; std::endl;
      return 0;
  }
  </code></pre>