title: How pointer pointee value returned without dereferencing pointer?
body: <p>When I reading <em>C++ Templates The Complete Guide (David Vandevoorde, Nicolai M. Josuttis)</em> I confused at following example</p>
  
  <p>This example is copied from titled <em>overloading function templates</em>, but my question is not related to overloading nor template.</p>
  
  <p>How s1, s2 and s3 pointers returned as value from max function. s1 , s2 and s3 contains address of char array but how these address converted to value without dereferencing that pointers?</p>
  
  <pre><code>#include &lt;iostream&gt;
  #include &lt;cstring&gt;
  #include &lt;string&gt;
  
  // maximum of three values of any type (call-by-reference)
  template &lt;typename T&gt;
  inline T const&amp; max (T const&amp; a, T const&amp; b, T const&amp; c)
  {
  return max (max(a,b), c); // error, if max(a,b) uses call-by-value
  }
  
  int main ()
  {
  const char* s1 = "frederic";
  const char* s2 = "anica";
  const char* s3 = "lucas";
  ::max(s1, s2, s3); // ERROR
  }
  </code></pre>