I've seen in several places the advice to either define your own assignment operator/copy constructor, or to block the default ones by declaring them private.
However, the only danger I've been able to find was the problem of creating copies of pointers that could be dangling pointers later.
In modern C++ pointers are rare, and most classes just use smart pointers (e.g. from boost or from the std library in C++11). Is it still necessary to declare the assignment operator and the copy constructor for classes that have no raw pointers?
And mainly: What are the dangers of not doing that? What kind of unexpected behavior can occur?