title: Why can't compilers expand arguments of a variadic template via comma operator?
body: <p>I know that <a href="https://stackoverflow.com/questions/10226090/can-variadic-expansions-be-used-as-a-chain-of-comma-operator-calls">we can't use variadic expansions as if it is a chain of comma operators</a>. In that question the sample is like this:</p>
  
  <pre><code>template&lt;typename... Args&gt;
  inline void increment_all(Args&amp;... args) 
  {
      ++args...; 
  }
  </code></pre>
  
  <p>It might be ambiguous either to increment or expand first so parentheses won't hurt:</p>
  
  <pre><code>template&lt;typename... Args&gt;
  inline void increment_all(Args&amp;... args)
  {
      (++args)...; 
  }
  </code></pre>
  
  <p>or something like this:</p>
  
  <pre><code>template&lt;typename... Args&gt;
  void cout_all(Args&amp;&amp;... args)
  {
      (std::cout &lt;&lt; std::forward&lt;Args&gt;(args))...; 
  }
  </code></pre>
  
  <p>I know that we can use some recursion tricks to get what we want, <a href="https://stackoverflow.com/questions/12342633/how-do-i-print-out-the-arguments-of-a-function-using-a-variadic-template">like this</a>. What I don't know is why does not the standard describe such behavior? I mean, what is the reason behind it?</p>