title: How does shared_ptr<> safely allow casting to bool?
body: <p>I was looking into how <code>std::tr1::shared_ptr&lt;&gt;</code> 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</p>
  
  <pre><code>operator bool() {
    return m_Ptr!=0;
  }
  </code></pre>
  
  <p>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 <code>unspecified_bool_type()</code>.  Can anyone explain how this mechanism works and how it prevents implicit casting to the underlying pointer type?</p>