代码之家  ›  专栏  ›  技术社区  ›  the_mandrill

共享的ptr<>如何安全地允许投射到bool?

  •  21
  • the_mandrill  · 技术社区  · 15 年前

    std::tr1::shared_ptr<>

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

    通常会隐式地转换为指针类型(可能是通过类型提升),这通常是不需要的。boost和Microsoft的实现似乎都使用了一个技巧,涉及到对 unspecified_bool_type() . 有人能解释一下这个机制是如何工作的,以及它是如何防止隐式转换到底层指针类型的吗?

    3 回复  |  直到 15 年前
        1
  •  35
  •   JoeG    10 年前

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

    对于C++ 11,这个习语不再是必要的。解决这个问题的现代方法是使用 explicit 运算符上的关键字:

    explicit operator bool() {
      return m_Ptr != nullptr;
    }
    
        2
  •  5
  •   Gorpik    15 年前

    技巧是这样的。在智能指针类型中定义所有这些(在本例中, 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 表情。

        3
  •  3
  •   sbi    15 年前

    bool 但是不支持很多隐式转换 布尔