这样的结构体应存储在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
问题,我想通过异步处理程序传递一些对象。
答案 0 :(得分:4)
如果lambda表达式通过副本捕获任何内容(隐式使用捕获子句
[=]
或使用不包含字符&amp;的捕获显式捕获,例如[a, b, c]
),则闭包类型包括未命名的非静态数据成员,以未指定的顺序声明,包含所有捕获的实体的副本。
因此,根据as-if rule,您的编译器将生成代码,如果您真的拥有此副本,那么该代码将保持活动状态。