c++constructormultiplatform

Initializing a union with a non-trivial constructor


I have a structure which I create a custom constructor to initialize the members to 0's. I've seen in older compilers that when in release mode, without doing a memset to 0, the values are not initialized.

I now want to use this structure in a union, but get errors because it has a non-trivial constructor.

So, question 1. Does the default compiler implemented constructor guarantee that all members of a structure will be null initialized? The non-trivial constructor just does a memset of all the members to '0' to ensure a clean structure.

Question 2: If a constructor must be specified on the base structure, how can a union be implemented to contain that element and ensure a 0 initialized base element?


Solution

  • Question 1: Default constructors do initialize POD members to 0 according to the C++ standard. See the quoted text below.

    Question 2: If a constructor must be specified in a base class, then that class cannot be part of a union.

    Finally, you can provide a constructor for your union:

    union U 
    {
       A a;
       B b;
    
       U() { memset( this, 0, sizeof( U ) ); }
    };
    

    For Q1:

    From C++03, 12.1 Constructors, pg 190

    The implicitly-defined default constructor performs the set of initializations of the class that would be performed by a user-written default constructor for that class with an empty mem-initializer-list (12.6.2) and an empty function body.

    From C++03, 8.5 Initializers, pg 145

    To default-initialize an object of type T means:

    To zero-initialize an object of type T means:

    For Q2:

    From C++03, 12.1 Constructors, pg 190

    A constructor is trivial if it is an implicitly-declared default constructor and if:

    From C++03, 9.5 Unions, pg 162

    A union can have member functions (including constructors and destructors), but not virtual (10.3) functions. A union shall not have base classes. A union shall not be used as a base class.An object of a class with a non-trivial constructor (12.1), a non-trivial copy constructor (12.8), a non-trivial destructor (12.4), or a non-trivial copy assignment operator (13.5.3, 12.8) cannot be a member of a union, nor can an array of such objects