Login | Register   
RSS Feed
Download our iPhone app
Browse DevX
Sign up for e-mail newsletters from DevX

Tip of the Day
Language: C++
Expertise: All
Mar 23, 2000



Full Text Search: The Key to Better Natural Language Queries for NoSQL in Node.js

Ensuring Proper Initialization of Template Arguments

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);
    // ..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.

Danny Kalev
Comment and Contribute






(Maximum characters: 1200). You have 1200 characters left.



Thanks for your registration, follow us on our social networks to keep up-to-date