我不想通过lambda中的值捕获shared_ptr,以确保对象的生命周期延伸到lambda函数被调用的点.
否则我实际上不需要shared_ptr.如果我做:
shared_ptr<..> sp;
sp->async_call( [sp](){} );
Run Code Online (Sandbox Code Playgroud)
即使身体没有引用它,sp仍然可以被复制吗?
我想说,因为这句话,它是有保证的。
\n5.1.2
\n\n\n21 当计算 lambda 表达式时,通过复制捕获的实体用于直接初始化生成的闭包对象的每个相应的非静态数据成员。(对于数组成员,数组元素按递增的下标顺序直接初始化。)这些初始化按声明非静态数据成员的(未指定)顺序执行。[注意:这确保破坏将以与构造相反的顺序发生。\xe2\x80\x94 尾注]
\n
编辑:再想一想,因为对象是直接初始化的,所以复制省略甚至没有发挥作用。
\n由于 中的复制省略标准 \xc2\xa7 12.8
,太长而无法发布,我不相信可以删除副本
但需要记住的是,std::shared_ptr
对于大多数用途来说,线程不是安全的。