智能指针作为条件:if (p)和if (p.get())是等价的
Smart pointer as condition: are if (p) and if (p.get()) equilavent?
设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操作的用法。
- Cpp-Tuple使用带有变量的get
- 我的简单if-else语句是如何无法访问的代码
- 如何将enable-if与模板参数和参数包一起使用
- 无论条件是否为true,if总是在c++中执行
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何删除peer if else分支中的冗长句子
- 我似乎对if/else的基本语句有问题:/
- if数组上的随机数
- 将按位if条件转换为普通if条件
- If语句在c++中被忽略
- cin.get();当我把它放在 if 语句中时不起作用
- 如何在C++宏中格式化"if"语句(以及如何使用Arduino的新EEPROM库get&put函数)
- 这"if e is a pack, then get a template name, otherwise get a variable name"有效与否?
- 智能指针作为条件:if (p)和if (p.get())是等价的