标题几乎总结了我的问题。为什么不能执行以下操作来检查空指针?
auto_ptr<char> p( some_expression );
// ...
if ( !p ) // error
必须这样做:
if ( !p.get() ) // OK
为什么auto_ptr<T>
没有定义operator!()
?
答案 0 :(得分:19)
似乎设计中存在错误。这将在C ++ 0x中修复。 unique_ptr
(替代auto_ptr
)包含explicit operator bool() const;
来自新C ++标准的引用:
不推荐使用类模板auto_ptr。 [注意:类模板unique_ptr(20.9.10)提供了一个 更好的解决 - 后注]
一些澄清:
问: a.get() == 0
出了什么问题?
A: a.get()==0
没有任何问题,但智能指针可让您使用它们,因为它们是真正的指针。额外的operator bool()
为您提供了这样的选择。我认为,不推荐使用auto_ptr
的真正原因是它没有直观的设计。但新标准中的operator bool
unique_ptr
表示没有理由不拥有它。
答案 1 :(得分:8)
简单地说,它应该定义operator !()
。 auto_ptr
不是一个设计精良的容器。 boost中的智能指针定义了operator bool()
转换运算符,可以使用operator !()
取消。这将让你的if(!p)
按预期编译和工作。
答案 2 :(得分:4)
布尔转换存在问题。它允许几乎总是痛苦的语法。
幸运的是,有一个解决方案:Safe Bool成语。
转换为bool
的问题是隐式转换很危险。
std::auto_ptr<T> p = ..., q = ....;
if (p < q) // uh ?
因此,operator bool() const
是令人厌恶的。你提供一个明确的方法......或者你使用安全的bool习语。
这个成语的想法是给你一个类型的实例,它有一个非常小的操作子集,而且几乎没有隐式转换会让你陷入麻烦的情况。这是通过使用指向成员函数的指针来完成的。
if (p)
和if (!p)
等操作有意义,但if (p < q)
无法编译。
仔细阅读完整解决方案的链接,您就会明白为什么不使用operator bool() const
是个好主意。
答案 3 :(得分:0)
我怀疑是因为预计将auto_ptr
传递给null将是一种罕见的情况,以避免添加额外的接口,并在实际检查null时使其显式。