title: std::get on std::tuple results in variadic args reducing to nothing with incomplete type error
body: <p>The following code produces a huge list of compiler errors:</p>
  
  <pre><code>/// Uses template recursion to bind all args
  template&lt;std::size_t N, typename... Args&gt; class Binder
  {
  public:
      Binder(Sqlite3StatementBase &amp;s, std::tuple&lt;Args...&gt; &amp;tup)
      {
          Binder&lt;N - 1, Args...&gt; b(s, tup);
          s.bind(N + 1, std::get&lt;N, Args...&gt;(tup)); // Line 182
      }
  };
  
  /// Specialization of Binder to end recursion at 0
  template&lt;typename... Args&gt; class Binder&lt;0, Args...&gt;
  {
  public:
      Binder(Sqlite3StatementBase &amp;s, std::tuple&lt;Args...&gt; &amp;tup)
      {
          s.bind(1, std::get&lt;0, Args...&gt;(tup));
      }
  };
  </code></pre>
  
  <p>The first batch of errors consists of:</p>
  
  <pre><code>In file included from /usr/include/c++/6/bits/unique_ptr.h:37:0,
               from /usr/include/c++/6/condition_variable:43,
               from /home/tony/htpc/Dev/logi/src/db/logi-db.h:22,
               from /home/tony/htpc/Dev/logi/src/db/logi-sqlite.h:26,
               from /home/tony/htpc/Dev/logi/src/db/logi-sqlite.cpp:24:
  /usr/include/c++/6/tuple: In instantiation of ‘class std::tuple_element&lt;1ul, std::tuple&lt;unsigned int&gt; &gt;’:
  /usr/include/c++/6/tuple:1228:12:   recursively required from ‘class std::tuple_element&lt;2ul, std::tuple&lt;unsigned int, unsigned int&gt; &gt;’
  /usr/include/c++/6/tuple:1228:12:   required from ‘class std::tuple_element&lt;3ul, std::tuple&lt;unsigned int, unsigned int, unsigned int&gt; &gt;’
  /usr/include/c++/6/utility:106:69:   required by substitution of ‘template&lt;long unsigned int __i, class _Tp&gt; using __tuple_element_t = typename std::tuple_element::type [with long unsigned int __i = 3ul; _Tp = std::tuple&lt;unsigned int, unsigned int, unsigned int&gt;]’
  /usr/include/c++/6/tuple:1270:5:   required by substitution of ‘template&lt;long unsigned int __i, class ... _Elements&gt; constexpr std::__tuple_element_t&lt;__i, std::tuple&lt;_Elements ...&gt; &gt;&amp;&amp; std::get(std::tuple&lt;_Elements ...&gt;&amp;&amp;) [with long unsigned int __i = 3ul; _Elements = {unsigned int, unsigned int, unsigned int}]’
  /home/tony/htpc/Dev/logi/src/db/logi-sqlite.h:182:47:   required from ‘logi::Sqlite3Database::Binder&lt;N, Args&gt;::Binder(logi::Sqlite3Database::Sqlite3StatementBase&amp;, std::tuple&lt;_Elements ...&gt;&amp;) [with long unsigned int N = 3ul; Args = {unsigned int, unsigned int, unsigned int}]’
  /home/tony/htpc/Dev/logi/src/db/logi-sqlite.h:238:71:   required from ‘void logi::Sqlite3Database::Sqlite3Statement&lt;Args&gt;::prepare_row(logi::Sqlite3Database::Sqlite3Statement&lt;Args&gt;::Tup&amp;) [with Args = {unsigned int, unsigned int, unsigned int}; logi::Sqlite3Database::Sqlite3Statement&lt;Args&gt;::Tup = std::tuple&lt;unsigned int, unsigned int, unsigned int&gt;]’
  /home/tony/htpc/Dev/logi/src/db/logi-sqlite.h:231:28:   required from ‘void logi::Sqlite3Database::Sqlite3Statement&lt;Args&gt;::execute(typename logi::Sqlite3Database::Sqlite3Statement&lt;Args&gt;::Parent::ArgsVector&amp;) [with Args = {unsigned int, unsigned int, unsigned int}; typename logi::Sqlite3Database::Sqlite3Statement&lt;Args&gt;::Parent::ArgsVector = std::vector&lt;std::tuple&lt;unsigned int, unsigned int, unsigned int&gt;, std::allocator&lt;std::tuple&lt;unsigned int, unsigned int, unsigned int&gt; &gt; &gt;]’
  /home/tony/htpc/Dev/logi/src/db/logi-sqlite.cpp:354:1:   required from here
  /usr/include/c++/6/tuple:1228:12: error: invalid use of incomplete type ‘class std::tuple_element&lt;0ul, std::tuple&lt;&gt; &gt;’
  </code></pre>
  
  <p>So it seems as if the <code>std::get</code> call is causing other parts of the system libraries (not directly related to <code>std::get</code> or <code>std::tuple</code>) to recursively reduce Args... to nothing, and this is happening independently of my recursion of the numerical template parameter N. Is there something I can fix in my code without fundamentally changing my approach, or is it just not possible to use <code>std::get</code> in a context where the tuple's template parameters are variadic?</p>