The reason is most probably that you're using Visual C++. Even as of version 10.0 Visual C++ does not do value initialization correctly. Your code works fine with g++ 4.4.1.
Around 2005 it was understandable that Visual C++ wasn't quite up to par, because the C++98 rules for initialization were changed in C++03. This was the only language change in C++03, which otherwise was just a "technical corrigendum" of C++98 (C++03 is sometimes called TC1, technical corrigendum 1). C++03 introduced "value initialization" as a generalization of "default initialization", in order to make the result less arbitrary and less baffling and just more practical for aggregate classes like yours, classes containing both POD and non-POD members: with C++03 rules those members are zero-initialized or default-initialized as appropriate, all of them. And it was a very good thing. T'was Andrew Koenig who proposed this, IIRC, and it weights up for his blame for Koenig Lookup (a.k.a. ADL, Argument Dependent Lookup). :-)
But as of 2010 it's a bit less understandable that Visual C++ doesn't do this correctly.
That said, your code is horrible. :-)
See the other comments for improvements to the code, including the idea of defining a constructor, which will fix the problem for Visual C++.
Cheers & hth.,