标题几乎总结了我的问题。为什么不能执行以下操作来检查空指针?
auto_ptr<char> p( some_expression );
// ...
if ( !p ) // error
这必须改为:
if ( !p.get() ) // OK
为什么auto_ptr<T>
不简单地operator!()
定义?
它的设计似乎有错误。这将在 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 bool
在unique_ptr
新标准中意味着没有理由不拥有它。
简单地说,它应该已经operator !()
定义了。auto_ptr
不是一个设计得很好的容器。boost 中的智能指针operator bool()
定义了转换运算符,可以用operator !()
. 这将使您if(!p)
按预期编译和工作。
布尔转换存在问题。它允许几乎总是很痛苦的语法。
幸运的是,有一个解决方案: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
.
我怀疑是因为预计将auto_ptr
s 传递给 null 将是一种罕见的情况,以避免添加额外的接口,并在实际检查 null 时使其明确。