In the following template member function, the parameter T can be a class or a built-in type:
void vector< T >::resize (size_type new_size) { T val; // oops! What if T is a built-in type? if (new_size > size()) insert(end(), new_size - size(), val); else // ..more stuff }
This code has a subtle bug. If T happens to be a built-in type, e.g., int, the variable val has a garbage value. On the other hand, if T is a class with a user-defined default constructor, the constructor will be invoked automatically and initialize val. To ensure that val is always properly initialized, regardless of its type, change the first line in resize() to the following:
T val = T(); // ensure proper initialization
This way, you guarantee that val is zero-initialized if it’s a built-in type. If, however, T is a class, the compiler will call val’s default constructor. Note that for class types, the following declarations are identical:
T val = T(); T val;
Both ensure that the default constructor is invoked; they differ only when T is a built-in type.