C++ 智能指针作为条件:if(p)和if(p.get())是否相等?

C++ 智能指针作为条件:if(p)和if(p.get())是否相等?,c++,c++11,shared-ptr,smart-pointers,unique-ptr,C++,C++11,Shared Ptr,Smart Pointers,Unique Ptr,设p为共享/唯一指针。如果p和如果p相等吗 如果不是,在什么情况下,这些条件或条件中的代码的行为会有所不同 从我读到的std::shared_ptr::operator bool检查get!=nullptr。这是运算符bool的精确实现吗?您不必担心精确实现,它会因编译器而异,因版本而异,可能还取决于您向编译器提供的选项 您应该关心符合标准的编译器的行为,答案是肯定的,ifptr应该始终产生与ifptr.get相同的结果 根据标准: 算术、非范围枚举、指针或指向成员类型的指针的prvalue可以

设p为共享/唯一指针。如果p和如果p相等吗

如果不是,在什么情况下,这些条件或条件中的代码的行为会有所不同


从我读到的std::shared_ptr::operator bool检查get!=nullptr。这是运算符bool的精确实现吗?

您不必担心精确实现,它会因编译器而异,因版本而异,可能还取决于您向编译器提供的选项

您应该关心符合标准的编译器的行为,答案是肯定的,ifptr应该始终产生与ifptr.get相同的结果

根据标准:

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

和智能指针计算为具有以下要求的指针:

类型为p的对象p可以在上下文中转换为bool子句[conv]。效果应与p!=nullptr已代替p进行评估

多亏了T.C.的这句话

智能指针上的运算符bool的目的是使智能指针在执行有效性检查的常见情况下,即在您编写代码的情况下,像常规指针一样工作

if (myPointer) {
    ... // Do something
}
具体的实现可能会有所不同。例如,标准兼容的实现可以检查存储get返回值的成员变量,或者检查指示指针未指向任何有效对象的私有标志,而不是调用get并将结果与nullptr进行比较

然而,对于程序员来说,只要知道当get返回非null值时,实现将随时返回true,当get返回nullptr时,实现也将返回false就足够了

如果p和如果p相等吗

同样适用于唯一的ptr:

检查*是否存储非空指针,即是否获取!=nullptr

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

如果不是,在什么情况下,这些条件或条件中的代码的行为会有所不同


他们的行为完全一样

这就是布尔运算符的精确实现吗

这正是实现的行为方式


确切的实现是。。。实现定义。您可以阅读您的标准库实现的源代码以找到答案。

它们的行为完全相同

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


这就是所谓的安全布尔成语。尽管它在c++11中似乎很难理解,但它很好地揭示了在SharedPTR上使用布尔操作。

你不相信cppreference吗?@NathanOliver我通常是这么认为的!我只是想确定一下这一点,因为我的共享指针是在多线程环境中使用的。为什么多线程环境会使这一切有所不同?@Slava问得好-我想我还没有仔细考虑为什么会这样。我想我担心基础对象会在if中被删除。但是无论哪种方式,p都将在if条件的作用域内,如果p是有效的指针,则保留一个引用计数。如果您在shared shared_ptr上有竞争条件,那么ifp.get不会使它变得更好,也不会使它变得更糟。std::shared_ptr有std::atomic专门化,或者您应该使用互斥。从技术上讲,这句话是不够的,因为unique_ptr支持奇特的指针,并且它的指针不一定是内置指针。不过,这已经包含在NullablePointer要求中了。我同意,但我找不到一个简洁的引语来说明智能指针的可能性。不过,据我所知,所有标准和boost智能指针的行为方式都与你期望的一样——这正是我试图表达的观点[花费你的精力去担心其他事情,相信编译器会把它做好[除非你是多线程的,这是后来添加到注释中的,在这种情况下,不要期望编译器读懂你的心思],结合。