title: What does this syntax " decltype(*(T*)(0)**(U*)(0)) " mean?
body: <p>I am reading <a href="https://isocpp.org/wiki/faq/cpp11-language-misc#suffix-return" rel="noreferrer">this question on isocpp FAQ here</a>, this question is explaining how to write the return type for <code>???</code></p>
  
  <pre><code>template&lt;class T, class U&gt;
  ??? mul(T x, U y)
  {
  return x*y;
  }
  </code></pre>
  
  <p>I understand the easy way is to write <code>auto mul(T x, U y) -&gt; decltype(x*y)</code>, however the question also gives another way, which is to replace <code>???</code> by <code>decltype(*(T*)(0)**(U*)(0))</code>. But I don't fully understand what this <code>decltype(*(T*)(0)**(U*)(0))</code> is really doing, it seems that it is declaring a temporary pointer <code>T*</code> and initialize it to zero and then dereference the pointer, then multiplied by the same counterpart for type <code>U</code>, is my understanding right?</p>
  
  <p>But why using pointers? I think <code>decltype(T(0)*U(0))</code> or <code>decltype(T{0}*U{0})</code> should also work.</p>