title: std::begin and std::end not working with pointers and reference why?
body: <p>Why <strong>std::begin()</strong> and <strong>std::end()</strong> works with array but not pointer[which is almost array] and reference of array [which is alias of original array].   </p>
  
  <p>After scratching my head for 15 min i am not able to get anything in google.    </p>
  
  <p>Below only first case works, not second and third, what could be the reason for this?</p>
  
  <pre><code>#include &lt;iostream&gt;
  #include &lt;vector&gt;
  #include &lt;iterator&gt;
  #include &lt;algorithm&gt;
  
  int main() 
  {
     int first[] = { 5, 10, 15 };  // Fist Case
  
      if (std::find(std::begin(first), std::end(first), 5) != std::end(first)) {
          std::cout &lt;&lt; "found a 5 in array a!\n";
      }
  
     int *second = new int[3];  // Second Case
      second[0] = 5;
      second[1] = 10;
      second[2] = 15;
      if (std::find(std::begin(second), std::end(second), 5) != std::end(second)) {
          std::cout &lt;&lt; "found a 5 in array a!\n";
      }
  
      int *const&amp;refOfFirst = first;  // Third Case
  
          if (std::find(std::begin(refOfFirst), std::end(refOfFirst), 5) != std::end(refOfFirst)) {
          std::cout &lt;&lt; "found a 5 in array a!\n";
      }
  }
  </code></pre>
  
  <p>Error:</p>
  
  <pre><code>error: no matching function for call to ‘begin(int&amp;)’
    if (std::find(std::begin(*second), std::end(*second), 5) != std::end(*second)) {
                                    ^
  </code></pre>