有没有推荐的方法来测试智能指针是否为空?

24

我想检查一个 std::shared_ptr 是否为 null。做以下两种方式是否有区别?

std::shared_ptr<int> p;
if (!p) { // method 1 }
if (p == nullptr) { // method 2 }

1
完全没有区别。你也可以写成 if(not p.get())。 - Richard Hodges
if (p.get() == nullptr)怎么样? - πάντα ῥεῖ
没有区别。一个少打很多字。 - Galik
2个回答

35

Is there a difference between doing

 std::shared_ptr<int> p;
 if (!p) { // method 1 }
 if (p == nullptr) { // method 2 }

没有区别。这两个操作都有适当定义的重载

另一个等效的操作是

 if(p.get() == nullptr)

1
理论上,在相对疯狂的情况下,第三种方法可能更加复杂,因为它必须在与nullptr进行比较之前获取T*。想象一下一个类型擦除的智能指针,在获取T*之前必须调用vtable方法,但如果该值为空,则保证vtable为nullptr。方法1和2可以短路可能的提取-T*,而3不能,因为.get()不知道它将仅被检查是否为空。 - Yakk - Adam Nevraumont

0

shared_ptr 提供了一个特定的 bool 转换运算符 std::shared_ptr::operator bool

测试是否未设置:

if (!p)

测试是否设置:

if (p)

你可以通过以下方式非常明确地表达你的意图:

if (static_cast<bool>(p))

我不同意你在示例中表达意图的方式。意图是检查 nullptr,所以对于这个问题来说,p != nullptr 更加明确。在你的示例中,你只是明确了你想调用 operator bool 的意图。 - Sergey Kolesnik
1
@SergeyKolesnik 这里的意图是想知道 shared_ptr 是否已经被设置/重置。 - Antonio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接