shared_ptr<>安全地允许铸造bool?

时间:2010-07-07 08:43:25

标签: c++ stl shared-ptr

我正在调查std::tr1::shared_ptr<>如何提供强制转换为bool的能力。在尝试创建一个可以作为简单解决方案进行bool的智能指针时,我已经陷入困境,即

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

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

3 个答案:

答案 0 :(得分:34)

问题中描述的技术是safe bool idiom

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

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

答案 1 :(得分: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;
  }

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

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

答案 2 :(得分:3)

它返回的通常是成员指针。成员指针可以被视为bool,但不支持bool所做的许多隐式转换。