title: prevent array decay in parameter pack expansion
body: <p>Is it possible to prevent array-to-pointer decay in arguments expanded from a parameter pack?</p>
  
  <p>For example:</p>
  
  <pre><code>#include &lt;iostream&gt;
  
  void foo() {
    std::cout &lt;&lt; "empty\n";
  }
  
  template &lt;typename T, typename... Rest&gt;
  void foo(T &amp;&amp;t, Rest... rest) {
    std::cout &lt;&lt; "T, ...\n";
    foo(rest...);
  }
  
  template &lt;typename... Rest&gt;
  void foo(char *p, Rest... rest) {
    std::cout &lt;&lt; "char*, ...\n";
    foo(rest...);
  }
  
  template &lt;int N, typename... Rest&gt;
  void foo(char (&amp;first)[N], Rest... rest) {
    std::cout &lt;&lt; "char[], ...\n";
    foo(rest...);
  }
  
  int main() {
    char a[2], b[2], c[2];
    foo(a, b, c);
  }
  </code></pre>
  
  <p>...outputs:</p>
  
  <pre><code>char[], ...
  char*, ...
  char*, ...
  empty
  </code></pre>
  
  <p>As you can see, the first call goes to the array-based overload, but subsequent calls go to the pointer-based overload.  <strong>Is there any way to get all of the calls to go to the array-based overload?</strong></p>
  
  <p>Related: <a href="https://stackoverflow.com/questions/13918400/problems-specializing-variable-template-function">Problems specializing variable template function</a></p>