title: Why do we need to extract the first element of a variadic pack in a C++ alias?
body: <p>Consider an alias based on a variadic template, that uses its first element in an expansion expression:</p>
  
  <pre><code>template&lt;typename T, typename... Ts&gt;
  using AllSame = std::conjunction&lt;std::is_same&lt;T, Ts&gt;...&gt;;
  </code></pre>
  
  <p>If we use this alias by passing the first element separately, the code compiles fine:</p>
  
  <pre><code>template&lt;typename T, typename... Ts&gt;
  using X = AllSame&lt;T, Ts...&gt;;
  </code></pre>
  
  <p>But simply passing an entire pack doesn't compile:</p>
  
  <pre><code>template&lt;typename... Ts&gt;
  using X = AllSame&lt;Ts...&gt;;
  </code></pre>
  
  <p>Here is the compile error:</p>
  
  <pre><code>error: pack expansion argument for non-pack parameter 'T' of alias template 'template&lt;class T, class ... Ts&gt; using AllSame = typename std::enable_if&lt;std::is_same&lt;bool_pack&lt;true, std::is_same&lt;T, Ts&gt;::value ...&gt;, bool_pack&lt;std::is_same&lt;T, Ts&gt;::value ..., true&gt; &gt;::value&gt;::type'
  </code></pre>
  
  <p>Why does the call site have to pass in the first parameter separately, and not just pass in the whole pack directly?</p>
  
  <p>Here is <a href="https://godbolt.org/z/pugt2W" rel="noreferrer">some code</a> to reproduce the problem.</p>