将共享指针存储在 lambda 中以使其保持活动状态
Store shared pointer in lambda to keep it alive
这样的结构旨在存储在 lambda 中:
struct MyStruct {
void testfunction() {
// Do something
}
};
我想要的是从中构造一个共享指针并将该指针存储在 lambda 中:
auto ptr = std::make_shared<MyStruct>();
std::function<void()> caller = [ptr](){
ptr->testFunction();
}
调用者对象被赋予一个函数并被该函数复制。 ptr
对象超出范围。当我传递调用者对象时,共享指针是否仍然存在?
是否保证 ptr
存储在 lambda 中并且只要调用者存在或被返回,对象就由该指针管理?如果我不调用 testFunction
,是否有任何编译器优化?
此问题特定于 boost::asio
问题,我想通过异步处理程序传递一些对象。
来自 cppreference
If the lambda-expression captures anything by copy (either implicitly with capture clause [=]
or explicitly with a capture that does not include the character &, e.g. [a, b, c]
), the closure type includes unnamed non-static data members, declared in unspecified order, that hold copies of all entities that were so captured.
因此,根据 as-if rule,您的编译器预计会生成代码,如果您确实拥有此副本,则该代码的行为将保持活动状态。
这样的结构旨在存储在 lambda 中:
struct MyStruct {
void testfunction() {
// Do something
}
};
我想要的是从中构造一个共享指针并将该指针存储在 lambda 中:
auto ptr = std::make_shared<MyStruct>();
std::function<void()> caller = [ptr](){
ptr->testFunction();
}
调用者对象被赋予一个函数并被该函数复制。 ptr
对象超出范围。当我传递调用者对象时,共享指针是否仍然存在?
是否保证 ptr
存储在 lambda 中并且只要调用者存在或被返回,对象就由该指针管理?如果我不调用 testFunction
,是否有任何编译器优化?
此问题特定于 boost::asio
问题,我想通过异步处理程序传递一些对象。
来自 cppreference
If the lambda-expression captures anything by copy (either implicitly with capture clause
[=]
or explicitly with a capture that does not include the character &, e.g.[a, b, c]
), the closure type includes unnamed non-static data members, declared in unspecified order, that hold copies of all entities that were so captured.
因此,根据 as-if rule,您的编译器预计会生成代码,如果您确实拥有此副本,则该代码的行为将保持活动状态。