为什么auto_ptr <t>没有定义operator!()?</t>

时间:2010-06-30 16:51:46

标签: c++ auto-ptr

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

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

必须这样做:

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

为什么auto_ptr<T>没有定义operator!()

4 个答案:

答案 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时使其显式。