The zero initialization is specified in the standard as default zero initialization/value initialization for builtin types, primarily to support just this type of case in template use.
Note that this behavior is different from a local variable such as int x;
which leaves the value uninitialized (as in the C language that behavior is inherited from).