我正在观看 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;
}
我的问题:为什么这里使用 [=]
捕获,而不是 [&]
(或者可能只是 []
?)
[=]
captures all automatic variables used in the body of the lambda by copy and current object by reference if exists
但我们没有任何自动变量,也不需要当前对象。
最佳答案
这里不需要capture-default。 []
就可以了。
正如我在评论中所写,这是一个未经测试的片段,用于说明完全不相关的事情(即 call_once
)。尝试过多地阅读它没有多大意义。
也就是说,就“为适合幻灯片而编写的未经测试的代码片段”这一类型而言,[=]
可能是最安全的默认 lambda 引入器 : [&]
可能导致数据竞争或悬垂引用,如果您需要捕获,[]
将是错误的,并且显式捕获会占用幻灯片上的宝贵空间 - 并且需要实际考虑捕获……
关于c++ - 仔细检查锁定模式 - 在传递给 call_once 的 lambda 中捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48622648/