Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将共享指针存储在lambda中以使其保持活动状态_C++_C++11_Lambda_Shared Ptr_Functor - Fatal编程技术网

C++ 将共享指针存储在lambda中以使其保持活动状态

C++ 将共享指针存储在lambda中以使其保持活动状态,c++,c++11,lambda,shared-ptr,functor,C++,C++11,Lambda,Shared Ptr,Functor,这样的结构旨在存储在lambda中: struct MyStruct { void testfunction() { // Do something } }; 我想从中构造一个共享指针,并将该指针存储在lambda中: auto ptr = std::make_shared<MyStruct>(); std::function<void()> caller = [ptr](){ ptr->testFunction(); } auto ptr=

这样的结构旨在存储在lambda中:

struct MyStruct {
  void testfunction() {
    // Do something
  }
};
我想从中构造一个共享指针,并将该指针存储在lambda中:

auto ptr = std::make_shared<MyStruct>();
std::function<void()> caller = [ptr](){
  ptr->testFunction();
}
auto ptr=std::make_shared();
std::函数调用方=[ptr](){
ptr->testFunction();
}
调用方对象被赋予一个函数,并由该函数复制。
ptr
对象超出范围。当我传递调用者对象时,共享指针是否仍然有效

只要调用方存在或返回,是否保证
ptr
存储在lambda中,并且对象由该指针管理?如果我不调用
testFunction
,是否有任何编译器优化

这个问题特定于一个
boost::asio
问题,我想用异步处理程序传递某个对象

来自

如果lambda表达式通过复制捕获任何内容(隐式使用capture子句
[=]
,或显式使用不包含字符的捕获,例如
[a,b,c]
),则闭包类型包括未命名的非静态数据成员,按未指定的顺序声明,保存如此捕获的所有实体的副本


因此,根据,预期编译器将生成代码,其行为类似于您确实拥有此副本,因此对象将保持活动状态。

是的,它将保持活动状态(您可以通过将日志添加到ctors/dtor来检查)。由于不涉及UB,优化器不会破坏这段代码。lambda捕获并使用
ptr
的副本。没有一个优化器可以处理这个问题。无论如何,如果不是一个有缺陷的优化器,@HolyBlackCat+1。它的
reference\u count
也像预期的那样得到了处理?你的意思是
use\u count()
?是的,为什么不呢。