title: What is the difference between std::ranges::begin and std::begin?
body: <p>What is the difference between <a href="https://eel.is/c++draft/iterator.range" rel="noreferrer"><code>std::begin</code></a> and the new <a href="https://eel.is/c++draft/range.access#begin" rel="noreferrer"><code>std::ranges::begin</code></a>? (same for <code>end</code>, <code>size</code>, etc.)</p>
  
  <p>Both seem to work identically:</p>
  
  <pre class="lang-cpp prettyprint-override"><code>#include &lt;iostream&gt;
  #include &lt;vector&gt;
  #include &lt;array&gt;
  #include &lt;ranges&gt;
  
  template&lt;std::ranges::range R&gt;
  void printInfo(const R &amp;range)
  {
      std::cout &lt;&lt; (std::ranges::begin(range) == std::begin(range));
  }
  
  template&lt;class T&gt;
  struct X
  {
      std::vector&lt;T&gt; v;
  
      auto begin() const { return v.begin(); }
      auto end() const { return v.end(); }
  };
  
  int main()
  {
      printInfo(std::vector{1, 2, 3, 4});
      printInfo(std::array{1, 2, 3, 4});
      printInfo(X&lt;int&gt;{{1, 2, 3, 4}});
  
      int oldSchool[]{1, 2, 3, 4};
      printInfo(oldSchool);
  }
  </code></pre>
  
  <p>Compiles and prints <code>1111</code>, as expected.</p>
  
  <p>Does <code>ranges::begin</code> make <code>std::begin</code> obsolete? Or do the two have different use-cases?</p>