shared_ptr <>如何安全地允许强制转换为bool?

the*_*ill 21 c++ stl shared-ptr

我正在研究如何std::tr1::shared_ptr<>提供强制转换为bool的能力.在尝试创建一个可以作为简单解决方案进行bool的智能指针时,我已经被抓住了,即

operator bool() {
  return m_Ptr!=0;
}
Run Code Online (Sandbox Code Playgroud)

通常最终可以隐式地转换为指针类型(可能是通过类型提升),这通常是不合需要的.boost和Microsoft实现似乎都使用了涉及强制转换的技巧unspecified_bool_type().任何人都可以解释这种机制如何工作以及它如何防止隐式转换为底层指针类型?

Joe*_*oeG 34

问题中描述的技术是安全的bool习语.

从C++ 11开始,不再需要这种习语.该问题的现代解决方案是explicit在运算符上使用关键字:

explicit operator bool() {
  return m_Ptr != nullptr;
}
Run Code Online (Sandbox Code Playgroud)


Gor*_*pik 5

诀窍就是这样.您可以在智能指针类型中定义所有这些(在本例中shared_ptr):

private:

  struct Tester
  {
    Tester(int) {}  // No default constructor
    void dummy() {}
  };

  typedef void (Tester::*unspecified_bool_type)();

public:

  operator unspecified_bool_type() const
  {
    return !ptr_ ? 0 : &Tester::dummy;
  }
Run Code Online (Sandbox Code Playgroud)

ptr_ 是智能指针类中的本机指针.

正如您所看到的,unspecified_bool_type是一个typedef无法被任何外部代码访问的类型,因为它Tester是一个私有结构.但是调用代码可以使用这种(隐式)转换为指针类型并检查它是否为null.在C++中,它可以用作bool表达式.