我不想通过lambda中的值捕获shared_ptr,以确保对象的生命周期延伸到lambda函数被调用的点。
否则我实际上不需要shared_ptr。如果我这样做:
shared_ptr<..> sp;
sp->async_call( [sp](){} );
即使身体没有引用它,sp仍然会被复制吗?
答案 0 :(得分:4)
我会说因为这个引用而得到保证 5.1.2
21评估lambda表达式时,复制捕获的实体用于直接初始化生成的闭包对象的每个对应的非静态数据成员。 (对于数组成员,数组元素按增加的下标顺序进行直接初始化。)这些初始化以(未指定的)顺序执行,其中声明了非静态数据成员。 [注意:这确保了破坏将以与构造相反的顺序发生。 - 结束说明]
编辑:第二个想法,因为对象是直接初始化的复制省略甚至没有发挥作用
由于 § 12.8
中复制省略的标准,发布时间太长,我不相信该副本可以被删除
要注意的是,std::shared_ptr
对于大多数用途来说不是线程安全的。