我正在观看Herb Sutter的CppCon 2014谈论无锁编程。
在handout page 7上,我们有以下代码:
static unique_ptr<widget> widget::instance;
static std::once_flag widget::create;
widget& widget::get_instance() {
std::call_once( create, [=]{ instance = make_unique<widget>(); } );
return *instance;
}
我的问题:为什么在这里使用[=]
捕获,而不是[&]
(或者只是[]
?)
[=]
通过复制捕获lambda体中使用的所有自动变量,如果存在,则通过引用捕获当前对象
但我们没有任何自动变量,也不需要当前的对象。
答案 0 :(得分:0)
这里不需要 capture-default 。 []
会做得很好。
正如我在评论中所写,这是一个未经测试的片段,用于说明完全不相关的事情(即call_once
)。尝试阅读太多内容并没有多大意义。
也就是说,就“编写适合幻灯片的未经测试的片段”而言,[=]
可能是最安全的默认 lambda-introductioncer :{{1}如果您需要捕获,可能会导致数据争用或悬空引用,[&]
会出错,而显式捕获会占用幻灯片上的宝贵空间 - 并且需要实际考虑捕获......