智能指针作为条件:是(p)和if(p.get())equilavent?

时间:2016-10-17 13:41:50

标签: c++ c++11 shared-ptr smart-pointers unique-ptr

p成为共享/唯一指针。 if (p)if (p.get())是否等效?

如果没有,那么这些条件或条件中的代码在什么情况下表现不同?

cppreference我看到std::shared_ptr::operator bool检查是否get() != nullptr。这是operator bool的确切实现吗?

4 个答案:

答案 0 :(得分:6)

“确切的实现”不应该是您的关注点(它将随编译器的不同而不同,从版本到版本,并且可能基于您为编译器提供的选项)

您的关注应该是“符合标准的编译器将如何运作”,答案是“是的,if(ptr)应始终产生与if(ptr.get())相同的结果

来自标准:

  

算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为bool类型的prvalue。零值,空指针值或空成员指针值转换为false;任何其他值都转换为true。类型为std :: nullptr_t的prvalue可以转换为bool类型的prvalue;结果值为false。

智能指针计为nullable pointers,具有以下要求:

  

P类型的对象p可以在上下文中转换为bool(Clause [conv])。效果应该像p!= nullptr一样被评估代替p。

(感谢T.C.的报价)

答案 1 :(得分:1)

智能指针operator bool()背后的目的是使智能指针在执行有效性检查的常见情况下表现得像常规指针,即在您编写的情况下

if (myPointer) {
    ... // Do something
}

确切的实施可能会有所不同。例如,可以检查存储get()返回的值的成员变量,或者检查指示私有标志,而不是调用nullptr并将结果与​​get()进行比较。指针没有指向任何有效的东西。

但是,出于程序员的目的,只要知道true返回非空值,并且它也将返回get(),实现将返回false就足够了。当get()返回nullptr时。

答案 2 :(得分:1)

  

if (p)(p.get())是否等效?

来自this reference(同样适用于unique_ptr):

  

检查*this是否存储非空指针,即是否get() != nullptr

是的,if (p)if (p.get())具有相同的行为。不,迂腐地说它们并不完全等价:前者有一个函数调用,后者有一个不同的函数调用和一个指针比较。在实践中,两者都可能生成相同的代码。

  

如果没有,那么这些条件或条件中的代码在什么情况下表现不同?

他们的行为完全相同。

  

这是operator bool的确切实现吗?

这正是实施必须表现的方式。

确切的实现是......实现定义。您可以阅读标准库实现的来源以查找。

答案 3 :(得分:1)

他们的行为完全相同。

为了找出我们可以使用指针null检查的各种方法,你可以看到以下

http://www.artima.com/cppsource/safebool.html

这被称为安全bool成语。尽管在c ++ 11中看起来似乎很有用,但它对于在sharedPtrs上使用bool操作提供了很好的揭示。