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

标签 c++ c++11 lambda std-call-once

我正在观看 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;
}

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

cppreference说:

[=] 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/

相关文章:

C++11 多线程 : State of thread after execution

c++ - 这是 C++11 中的 struct POD 吗?

java - JAVA 中用于嵌套条件的 Lambda 表达式

c# - Expression.Call 重载之间的区别?

c++ - 在Windows窗体应用程序的点击功能中使用字符串

c++ - C++程序中打开的文件数

c++ - C++ 中的 char* vs std::string

c++ - 为什么出现 "no matching overload found"错误,即使我定义了它们

java - Scala lambdas 实现与 Java 8

c++ - 如何在注册表中注册一个类?