10

我不想在 lambda 中按值捕获 shared_ptr 以确保对象的生命周期延伸到调用 lambda 函数的点。

否则我实际上不需要 shared_ptr 。如果我做:

shared_ptr<..> sp;
sp->async_call( [sp](){} );

即使正文没有引用 sp,是否保证会被复制?

4

1 回答 1

4

我会说,因为这句话,它是有保证的。
5.1.2

21 计算 lambda 表达式时,复制捕获的实体用于直接初始化结果闭包对象的每个对应的非静态数据成员。(对于数组成员,数组元素以下标递增的顺序直接初始化。)这些初始化以声明非静态数据成员的(未指定)顺序执行。[注意:这确保了破坏将以与构造相反的顺序发生。——尾注]

编辑:再三考虑,因为对象是直接初始化的复制省略甚至没有发挥作用。
由于复制省略的标准,§ 12.8发帖太长,我不相信可以省略复制

不过要记住的一点是,std::shared_ptr对于大多数用途而言,它不是线程安全的。

于 2013-11-12T06:11:02.657 回答