智能指针作为条件:if (p)和if (p.get())是等价的

Smart pointer as condition: are if (p) and if (p.get()) equilavent?

本文关键字:if get 指针 智能 条件      更新时间:2023-10-16

p为共享/唯一指针。if (p)if (p.get())相等吗?

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

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

"确切的实现"不应该是你关心的(它会因编译器,版本而异,可能基于你提供给编译器的选项)

你关心的应该是"一个标准兼容的编译器将如何表现",答案是"是的,if(ptr)应该总是产生与if(ptr.get())相同的结果

来自标准:

算术、无作用域枚举、指针或指向成员类型的指针的右值可以转换为bool类型的右值。零值、空指针值或空成员指针值被转换为false;任何其他值都被转换为true。std::nullptr_t类型的右值可以转换为bool类型的右值;结果值为false。

和智能指针计数为可空指针,它们具有以下要求:

类型p的对象p可以根据上下文转换为bool(子句[conv])。效果就好像p != nullptr代替了p。

(感谢T.C.的报价)

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

的情况下
if (myPointer) {
    ... // Do something
}

确切的实现可能不同。例如,不需要调用get()并将结果与nullptr进行比较,一个符合标准的实现可以检查存储get()返回值的成员变量,或者检查指示指针未指向任何有效对象的私有标志。

对于程序员来说,只要知道当get()返回一个非空值的时候,这个实现会返回true,当get()返回nullptr的时候,它也会返回false就足够了。

if (p)和if (p.get())相等吗?

从这个参考(同样适用于unique_ptr):

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

是的,if (p)if (p.get())具有相同的行为。不,从学究的角度来说,它们并不完全等同:前者有一个函数调用,后者有一个不同的函数调用和一个指针比较。实际上,两者都可能生成相同的代码。

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

它们的行为完全相同。

这是操作符bool的确切实现吗?

这正是实现必须的行为。

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

它们的行为完全相同。

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

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

称为安全bool习惯用法。尽管它在c++11中似乎已经被淘汰了,但它很好地揭示了sharedPtrs上bool操作的用法。