Boost logo

Boost :

From: David Abrahams (dave_at_[hidden])
Date: 2005-05-22 21:07:53

Rene Rivera <grafik.list_at_[hidden]> writes:

> Many of the problems that CodeWarrior, and True64, have with the
> serialization library stem from the behavior of CW to not call
> constructors for static data members in one particular class in the
> library. I've come to think that this is standard conforming behavior.
> The serialization library relies on a static member of a template class
> being constructed at global initialization time to figure out what all
> the serialized classes are. The problem is that the template class is
> being instantiated implicitly. Which for most compilers also
> instantiates any static members of that template class. It's my
> understanding that this violates
> "The implicit instantiation of a class template does not cause any
> static data members of that class to be implicitly instantiated."
> Question I have.. Is my understanding correct? Or is this a bug in CW part?

Your understanding is certainly correct. It's standard practice in
traits templates, for example, to do something like:

template <class T>
struct is_whatever
    static T& x;

    template <class U>
    char test(U&);
    template <class U>
    char (& test( whatever<U>& ) )[2];

    enum { value = sizeof(test(x)) == 2 };

Nobody ever even writes an initializer for x.

Dave Abrahams
Boost Consulting

Boost list run by bdawes at, gregod at, cpdaniel at, john at