代码之家  ›  专栏  ›  技术社区  ›  Paul J. Lucas

为什么汽车没有操作员!()定义?

  •  20
  • Paul J. Lucas  · 技术社区  · 16 年前

    auto_ptr<char> p( some_expression );
    // ...
    if ( !p )  // error
    

    必须这样做:

    if ( !p.get() ) // OK
    

    为什么不呢 auto_ptr<T> operator!() 定义?

    4 回复  |  直到 16 年前
        1
  •  20
  •   Kirill V. Lyadvinsky    16 年前

    似乎它的设计有错误。这将被固定在C++ 0x中。 unique_ptr (替换为 auto_ptr )包含 explicit operator bool() const;

    引用新C++标准:

    类模板auto\u ptr已弃用[注意:类模板unique\u ptr(20.9.10)提供


    一些澄清:
    问: 你怎么了 a.get() == 0 ?
    答: 没有什么不对的 a.get()==0 ,但智能指针允许您使用它们,因为它们是真正的指针。附加 operator bool() 给你这样的选择。我想,这才是 不赞成的是没有直观的设计。但是 operator bool 在新标准中,这意味着没有理由不拥有它。

        2
  •  8
  •   Nick Strupat    16 年前

    简单地说,它应该 operator !() 定义。 auto_ptr 不是一个设计得很好的容器。boost中的智能指针具有 operator bool() 定义的转换运算符,可以用 . 那会让你的 if(!p) 按预期编译和工作。

        3
  •  5
  •   Matthieu M.    16 年前

    布尔转换有问题。它允许几乎总是令人痛苦的语法。

    幸运的是,有一个解决办法: Safe Bool

    转换为的问题 bool 隐式转换是危险的。

    std::auto_ptr<T> p = ..., q = ....;
    
    if (p < q) // uh ?
    

    operator bool() const 是一种可憎的东西。要么你提供一个显式的方法。。。或者你用“安全布尔”这个成语。

    这个习惯用法的思想是给您一个类型实例,其中包含非常小的操作子集,并且几乎没有任何情况下隐式转换会给您带来麻烦。这是通过使用指向成员函数的指针来实现的。

    操作如 if (p) if (!p) 那么说得通,但是 if (p < q) 将无法编译。

    仔细阅读完整的解决方案的链接,你就会意识到为什么不这样做是个好主意 .

        4
  •  0
  •   Mark B    16 年前

    我怀疑是因为 auto_ptr

    推荐文章