Search code examples
c++stlshared-ptr

How does shared_ptr<> safely allow casting to bool?


I was looking into how std::tr1::shared_ptr<> provides the ability to cast to bool. I've got caught out in the past when trying to create a smart pointer that can be casted to bool as the trivial solution, ie

operator bool() {
  return m_Ptr!=0;
}

usually ends up being implicitly castable to the pointer type (presumably by type promotion), which is generally undesirable. Both the boost and Microsoft implementations appear to use a trick involving casting to an unspecified_bool_type(). Can anyone explain how this mechanism works and how it prevents implicit casting to the underlying pointer type?


Solution

  • The technique described in the question is the safe bool idiom.

    As of C++11, that idiom is no longer necessary. The modern solution to the problem is to use the explicit keyword on the operator:

    explicit operator bool() {
      return m_Ptr != nullptr;
    }