title: Does `sizeof` *really* evaluate to a `std::size_t`? Can it?
body: <p>Take the following standard passage:</p>
  
  <blockquote>
    <p><code>[C++11: 5.3.3/6]:</code> The result of <code>sizeof</code> and <code>sizeof...</code> is a constant of type <code>std::size_t</code>. <em>[ Note:</em> <code>std::size_t</code> is defined in the standard header <code>&lt;cstddef&gt;</code> (18.2). <em>—end note ]</em></p>
  </blockquote>
  
  <p>Now:</p>
  
  <blockquote>
    <p><code>[C++11: 18.2/6]:</code> The type <code>size_t</code> is an implementation-defined unsigned integer type that is large enough to contain the size in bytes of any object.</p>
  </blockquote>
  
  <p>Granted, the passage doesn't require that <code>size_t</code> is a type alias defined with <code>typedef</code>, but since it's explicitly stated to be made available by the standard header <code>&lt;cstddef&gt;</code>, I think we can take as read that failing to include <code>&lt;cstddef&gt;</code> should remove any guarantee that <code>size_t</code> shall be available to a program.</p>
  
  <p>However, according to that first quote, we can regardless obtain an expression of type <code>std::size_t</code>.</p>
  
  <p><a href="http://coliru.stacked-crooked.com/a/2773cc8d2a92d4e7">We can actually demonstrate both of these facts</a>:</p>
  
  <pre><code>int main()
  {
      typedef decltype(sizeof(0)) my_size_t;
  
      my_size_t x   = 0;  // OK
      std::size_t y = 1;  // error: 'size_t' is not a member of 'std'
  }
  </code></pre>
  
  <p><code>std::size_t</code> is not visible to the program, but <code>sizeof(0)</code> still gives us one? Really?</p>
  
  <p><strong>Is it therefore not correct to say that <code>5.3.3/6</code> is <em>flawed</em>, and that it actually has "the same type as whatever <code>std::size_t</code> resolves to", but <em>not</em> <code>std::size_t</code> itself?</strong></p>
  
  <p>Sure, the two are one and the same if <code>std::size_t</code> is a type alias but, again, nowhere is this actually required.</p>