It requires that the underlying type be copy-constructible, that's about it. If the copy constructor of the wrapped type does the right thing, then copied_ptr<> does the right thing. If the wrapped type has some oddity, such as requiring cloning to be done through a clone() method, then I usually invent a wrapper specific to that type. But it doesn't happen often.
A far less common but equally useful wrapper is not_copied<>, which does nothing at all in its copy constructor and assignment operator. I use that when I specifically DO NOT want a particular member to be copied when the object is copied. For instance, if it has a const member. When a const member is present, the compiler can't generate a default copy constructor or assignment operator, forcing you to write one yourself -- unless you wrap the type up in a not_copied<>.