为什么auto_ptr <T>没有定义运算符!()?

Pau*_*cas 20 c++ auto-ptr

标题几乎总结了我的问题.为什么不能执行以下操作来检查空指针?

auto_ptr<char> p( some_expression );
// ...
if ( !p )  // error
Run Code Online (Sandbox Code Playgroud)

必须这样做:

if ( !p.get() ) // OK
Run Code Online (Sandbox Code Playgroud)

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

Kir*_*sky 19

似乎它的设计有错误.这将在C++ 0x中修复.unique_ptr(替换auto_ptr)包含explicit operator bool() const;

从新的C++标准引用:

不推荐使用类模板auto_ptr.[注意:类模板unique_ptr(20.9.10)提供了更好的解决方案. - 尾注]


一些澄清:
问:有什么问题a.get() == 0
答:没有错a.get()==0,但智能指针可以让你使用它们,因为它们是真正的指针.附加operator bool()为您提供了这样的选择.我认为,auto_ptr弃用的真正原因是它没有直观的设计.但是operator bool对于unique_ptr新标准来说意味着没有理由不拥有它.

  • 它对构造函数意味着同样的意义 - 构造函数或转换运算符不参与当您尝试将对象传递给期望不同类型的arg的函数时发生的隐式转换舞蹈 (3认同)
  • @ stinky472:从根本上说,智能指针不能具有与指针完全相同的公共接口,否则(根据定义)它们不会是智能的.特别是`auto_ptr`并不是一个更好的指针,它有一个接口,以可靠的异常安全方式处理所有权的转移. (3认同)

Nic*_*pat 8

简单地说,它应该已经operator !()定义.auto_ptr不是一个设计得很好的容器.boost中的智能指针operator bool()定义了转换运算符,可以取消operator !().这将让您if(!p)按预期编译和工作.

  • "`auto_ptr`不是一个设计得很好的容器"总结得很好. (9认同)
  • @查尔斯,我喜欢你如何为它辩护,但你不同意它只是糟透了吗?如果它的用法与指针的用法不同,那么它的名字选择得非常糟糕. (5认同)
  • `auto_ptr`不是容器.另外为什么要定义`operator!()`?如果您要声明这一点,那么我认为您需要证明这一主张是正确的.我看不出任何固有的理由来定义它; 它不像`if(a.get()== 0)`不清楚或难以使用. (3认同)
  • 如果某些东西被设计成像一个更智能的指针,那么它的接口应该类似于指针. (3认同)

Mat*_* M. 5

布尔转换存在问题。它允许几乎总是痛苦的语法。

幸运的是,有一个解决方案:Safe Bool习语。

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

std::auto_ptr<T> p = ..., q = ....;

if (p < q) // uh ?
Run Code Online (Sandbox Code Playgroud)

因此,operator bool() const是可憎的。要么提供一个明确的方法……要么使用安全布尔习语。

习惯用法的想法是为您提供一个类型的实例,该实例具有非常小的操作子集,并且几乎没有隐式转换会给您带来麻烦的情况。这是通过使用指向成员函数的指针来完成的。

像操作if (p)if (!p)再有道理,但if (p < q)将无法编译。

仔细阅读完整解决方案的链接,您就会明白为什么不使用operator bool() const.