标题几乎总结了我的问题.为什么不能执行以下操作来检查空指针?
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
新标准来说意味着没有理由不拥有它.
简单地说,它应该已经operator !()
定义.auto_ptr
不是一个设计得很好的容器.boost中的智能指针operator bool()
定义了转换运算符,可以取消operator !()
.这将让您if(!p)
按预期编译和工作.
布尔转换存在问题。它允许几乎总是痛苦的语法。
幸运的是,有一个解决方案: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
.