运算符 -> 或 ->* 应用于 "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();
}
}
在 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();
}
}