仔细检查锁定模式 - 在传递给call_once的lambda中捕获

ein*_*ica 5 c++ lambda c++11 std-call-once

我正在观看Herb Sutter的CppCon 2014关于无锁编程的讨论.

第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;
}
Run Code Online (Sandbox Code Playgroud)

我的问题:为什么[=]在这里使用捕获,而不是[&](或者只是[]?)

cppreference说:

[=] 如果存在,则通过引用捕获lambda主体中使用的所有自动变量,并通过引用捕获当前对象

但我们没有任何自动变量,也不需要当前对象.

T.C*_*.C. 1

这里不需要捕获默认值[]就可以了。

正如我在评论中所写,这是一个未经测试的片段,旨在说明完全不相关的事物(即call_once)。试图对其进行过多解读并没有多大意义。

也就是说,就“为适合幻灯片而编写的未经测试的片段”这一类型而言,[=]可能是最安全的默认lambda-introducer[&]可能会导致数据争用或悬空引用,[]如果您需要捕获,则将是错误的,并且显式捕获占用了幻灯片上的宝贵空间 - 并且需要实际考虑捕获......