运算符 -> 或 ->* 应用于 "const std::weak_ptr" 而不是指针 typeC/C++

operator -> or ->* applied to "const std::weak_ptr" instead of to a pointer typeC/C++

在 lambda 函数中,我试图使用 weak_ptr 来访问所有成员函数和变量,而不是这个,但我收到了这个错误:

operator -> or ->* applied to "const std::weak_ptr" instead of to a pointer type

std::weak_ptr<T> 通过设计安全地引用可能仍然存在或可能不存在的对象。它不提供 operator->operator*,因为您必须确保该对象仍然存在,然后才能尝试访问它。

要访问由 std::weak_ptr 引用的对象,您首先调用 lock(),其中 returns 为 std::shared_ptr。然后,您需要检查 std::shared_ptr 是否引用了一个对象。如果是,则该对象可以安全访问,并且在返回的指针被销毁之前不会被删除(因为它仍然存在 std::shared_ptr)。如果不是,则 std::weak_ptr 指的是一个您无法再访问的已销毁对象。

Example :

#include <memory>

class foo 
{
public:
    void bar(){}
};

void test(std::weak_ptr<foo> ptr)
{
    // Get a shared_ptr
    auto lock = ptr.lock();

    // Check if the object still exists
    if(lock) 
    {
        // Still exists, safe to dereference
        lock->bar();
    }
}