title: Why ADL does not resolve to the correct function with std::get
body: <p>I am trying to code a template function that uses an ADL resolved <code>get</code> to fetch members of a struct/range (<code>tuple</code>-esque).</p>
  
  <pre><code>#include &lt;iostream&gt;
  #include &lt;utility&gt;
  #include &lt;tuple&gt;
  
  int main() {
      auto tup = std::make_tuple(1, 2);
      std::cout &lt;&lt; get&lt;0&gt;(tup) &lt;&lt; std::endl;
  }
  </code></pre>
  
  <p>I am doing this because of what the structured bindings proposal (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659.pdf" rel="noreferrer">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659.pdf</a>  §11.5.3) says about how <code>get</code> is used to fetch elements from the struct.  It says that a non member <code>get</code> is used to fetch elements from within the struct.  </p>
  
  <p>I assumed that the code above would compile, because ADL would cause the <code>get</code> function to be looked for in the <code>std</code> namespace (because it's argument is of type <code>std::tuple&lt;int, int&gt;</code>, which is in <code>std</code>), where it would be found.  But, I get an error.  Can someone explain the right approach here and also why the code above does not work?  How can one force ADL to happen in this case?</p>