Why is this static_cast not allowed?

NmdMystery picture NmdMystery · Jan 15, 2014 · Viewed 10.8k times · Source

I have an object of class A that I want to allocate on a custom stack object. To do this, I simply move the stack pointer as many bytes as the object is in size and return its previous value:

class A : public B {}; //B is from a precompiled library

class stack {
public:
    stack(void): _top(&_storage[0]) {}

    template <typename T>
    inline T* push(void) {
        T* ptr = static_cast<T*>(_top);

        _top += sizeof(T);

        return ptr;
    }

    //...

private:
    char _storage[1024];
    char* _top;
};

stack _stack;

int main(int argc, char** argv) {
    A* a = _stack.push<A>(); //ignore the lack of a constructor call

    return 0;
}

Visual C++ simply tells me that static_cast cannot convert from char* to A*. A regular C style cast does not give me this error, but I'd rather be more explicit and avoid a dynamic cast (A inherits from another class, but does not contribute to the vtable it doesn't have). Is there any difference between the two in this case?

Answer

David Rodr&#237;guez - dribeas picture David Rodríguez - dribeas · Jan 15, 2014

By design.

The static_cast conversion is not designed to convert between unrelated pointer types, for that you need to use reinterpret_cast. If you want to be explicit about the cast you are doing, then use the correct one. The C style cast will do a reinterpret_cast in this case.

You really need to research about the different cast operators, as the comment on dynamic_cast does not make much sense either.