std::auto_ptr is fine as long as it is used for what it was designed for: providing lightweight management of the life of a single object. A boost::shared_pointer is effectively a reference counted pointer, which is heavy weight compared to a std::auto_ptr. That difference of robustness you suggest is caused by programmers who keep using auto_ptr as if it was a reference countered pointer, which it never was. From a design perspective, auto_ptr should never have supported any copy semantics, rather than supporting weird copy semantics, but that's another story.
As to original question, the use of any cast is generally best avoided in C++, whether the old-style C casts or the C++ "new style" casts. In fact their long names (dynamic_cast, reinterpret_cast, static_cast, const_cast) were deliberately chosen to make them a little inconvenient to use, and to act as an alert to revisit code design to avoid them if at all possible.