I'm curious:
weak_ptr doesn't provide the user with operator== and yet I'm able to successfully use the find member function of std::set.
I've done some debugging to try and see how this is happening, and apparently weak_ptr is not even being converted to a shared_ptr in order to do the equality check. I went as far down as stl_tree.h where the actual equality check is being done. At that point a pointer to weak_ptr has been created.
What exactly determines that an std::set find() member function works with weak pointers, but not a std::vector one?