21

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

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

这必须改为:

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

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

4

4 回答 4

20

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

引用新 C++ 标准:

类模板 auto_ptr 已弃用。[注意:类模板 unique_ptr (20.9.10) 提供了更好的解决方案。——尾注]


一些澄清:
问:有什么问题a.get() == 0
答:没有任何问题a.get()==0,但是智能指针让您可以像使用它们一样使用它们,因为它们是真正的指针。Additionaloperator bool()给你这样的选择。我认为,弃用的真正原因auto_ptr是它没有直观的设计。但是operator boolunique_ptr新标准中意味着没有理由不拥有它。

于 2010-06-30T17:01:46.963 回答
8

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

于 2010-06-30T16:59:08.417 回答
5

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

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

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

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

if (p < q) // uh ?

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

这个习语的想法是给你一个类型的实例,它的操作子集非常少,而且几乎没有隐式转换会给你带来麻烦的情况。这是通过使用指向成员函数的指针来完成的。

像然后这样的操作if (p)有意义if (!p),但if (p < q)将无法编译。

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

于 2010-06-30T17:24:27.720 回答
0

我怀疑是因为预计将auto_ptrs 传递给 null 将是一种罕见的情况,以避免添加额外的接口,并在实际检查 null 时使其明确。

于 2010-06-30T17:01:26.200 回答