title: Explanations over NULL, 0, nullptr
body: <p>consider the code</p>
  
  <pre><code>#include &lt;iostream&gt;
  
  void foo(int* p)
  {
    std::cout &lt;&lt; "pointer" &lt;&lt; '\n';
  }
  
  void foo(int p)
  {
    std::cout &lt;&lt; "value" &lt;&lt; '\n';
  }    
  
  int main()
  {    
    foo( 0 );    // value
    foo( NULL ); // error: call of overloaded ‘foo(NULL)’ is ambiguous foo( NULL );
  
    return 0;
  }
  </code></pre>
  
  <p>Here we can see a problem with choosing a right overload for null pointer, which can be solved by passing <code>nullptr</code> to a second call of the function <code>foo</code>, but my question is about something different ...</p>
  
  <p>As I knew most implementations define <code>NULL</code> as just a constant literal <code>0</code> like (<code>#define NULL 0</code>), therefore it is expected at the compilation time to have a 2nd call be like this - <code>foo( 0 )</code>, </p>
  
  <p>But the preprocessor gives some strange output (after running <code>g++ -std=c++11 -E main.cpp -o main</code> )</p>
  
  <pre><code>int main()
  {
  
   foo( 0 );
  
   foo(
  # 25 "main.cpp" 3 4
       __null
  # 25 "main.cpp"
            );
  
   return 0;
  }
  </code></pre>
  
  <p>What is <code>__null</code> here ??</p>
  
  <p>Is this a built int type ??</p>