Boost logo

Boost :

From: Steven Watanabe (steven_at_[hidden])
Date: 2007-10-11 20:23:42


AMDG

Simonson, Lucanus J <lucanus.j.simonson <at> intel.com> writes:

> The reason it is categorized as undefined is because Derived may extend
> Base by adding data members, inheriting from another base, or adding a
> virtual pointer.

Here are some other things which could break your code:

// this is POD
struct Base {
    char c;
};

// This is not POD
struct Derived : Base {
    int hidden_variable_added_by_the_compiler;
};

Now the alignment of Derived is stricter than that of Base.
The standard explicitly states that using a reinterpret_cast
from Base to Derived is not guaranteed to be reversible.
It also states that the result of a static_cast from Base to
Derived is unspecified.

Another example

// This is POD
struct Base {
};

class Derived {
    thread_id_t hidden_variable_added_by_compiler;
    void f() {
        // code added by compiler
        // Try to determine whether the class Derived
        // may need to be thread safe. Note that more
        // sophisticated tests are possible, such as checking
        // whether some mutex is locked.
        if(hidden_variable_added_by_compiler != get_current_thread_id()) {
            if(hidden_variable_added_by_compiler == 0) {
                hidden_variable_added_by_compiler = get_current_thread_id();
            } else {
                add_shared_type(typeid(Derived));
            }
        }

        //use Base only
    }
};

Now even though f doesn't appear to access any derived class members
it really does.

In Christ,
Steven Watanabe


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk