- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
到目前为止,在查看 C++ lambda expressions in the c++11
style 时,我将它们全部分为两大类:捕获和非捕获。
非捕获 lambda,虽然在编写方式上受到更多限制,但在使用方式上更加灵活——它们可以是 implicitly converted to analogous function-pointer types ;他们不鼓励无偿std::function<…>
用法,它们的实现范围是less likely to creep out and cause side-effect problems , 等等。
然而,捕获 lambda 可以用更广泛的方式编写。不可否认,它们并没有赋予我刚才提到的所有这些好处。但是捕获 lambda 弥补了它可以解决的大量问题,它打破了堆栈的前馈函数调用 DAG 的限制,提供了对周围范围的多种访问形式。
不过,这就是我的理解。当我使用捕获 lambda 表达式时,当我需要一到两个变量时,我倾向于显式引用捕获特定变量:
using lambda_t = std::function<std::add_pointer_t<void>(int)>;
lambda_t lambda_explicit = [&one, &another](int descriptor) {
return ::mmap(nullptr, one, PROT_READ, MAP_PRIVATE, descriptor, another);
};
…如果有两个以上,我更愿意(出于同等的语法强制症和懒惰)避免显式命名捕获,而支持对所有内容的引用形式:
lambda_t lambda_everything = [&](int descriptor) {
return ::mmap(nullptr, one, PROT_READ, MAP_PRIVATE, descriptor, another);
};
... 注意,更改 lambda 捕获的形式不会改变任何关于 lambda 类型的明显信息——例如,调用签名是相同的。这是违反直觉的,因为看起来 much of the way capturing works is vaguely specified and somewhat implementation-specific , 有点与捕获表达式提供的详细正式多样性成反比(或者它是声明?还是声明列表?……我不确定)如果你去最后一个链接,你会看到它的全部荣耀然后向下滚动一点。
我什至没有触及绝大多数可能性——我几乎总是只做其中之一:
[&]
在什么情况下我应该特意使用一种捕获方式而不是另一种捕获方式?
哪些形式是特例,一般应避免?哪些有明显的惩罚——在性能、代码大小、潜在的 UB 或其他方面?任何捕获表单是否具有切实和/或简单的好处?
最佳答案
What are the circumstances in which I should go out of the way to use one form of capturing over the other?
当您仅限于使用无状态函数时,捕获不是一种选择,并且您仅限于 1。将回调注册到 C 语言 API 时通常是这种情况。
当你想将一个对象移动到一个捕获中时,你必须将它移动到一个命名的捕获中,因此被限制为 2。但这在 C++11 中是不可能的;您需要从 C++14 捕获的广义 lambda。广义捕获对于具有不需要与外部通信的初始状态的可变 lambda 也很有用(除非明确返回)。
此外,当您希望通过值捕获一组变量并通过引用捕获另一组变量时,默认情况下您最多可以捕获一组,并且必须至少显式捕获一组。也就是说,这可能是一个特例。我不记得曾经需要这个。
我认为没有必要使用默认捕获,但它可以节省大量冗余输入。
关于c++ - 什么时候在 C++11 lambda 的定义中需要明确命名的变量捕获?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56238211/
我在 linux 上工作。我对windows没有太多想法。 windows中文件的权限是如何组织的?我们在unix中是否有像chmod这样的api来更改权限? 最佳答案 对于 Windows,有一个名
应用程序编程接口(interface) (API) 是一组用于访问基于 Web 的软件应用程序的编程指令和标准。 如果出现 ,有人可以向我解释一下吗?谷歌地图 或 优酷 这是API哪个是softwar
我有两个应用程序,A 和 B,它们使用 android 库 C。B 有一个服务 A 想通过 C 使用,例如 在我的库中有一个类试图将它绑定(bind)到服务,
我正在正常或安全模式下启动相机应用程序,具体取决于使用我的应用程序执行的手势,但一旦用户选择应用程序并点击始终,则没有选项可以更改默认值,即使是从 Android 的设置菜单中也是如此. camera
我有一个数据集,本质上是一个稀疏二进制矩阵,表示两个集合的元素之间的关系。例如,让第一组是人(用他们的名字表示),例如像这样的东西: people = set(['john','jane','mike
何为pythonic? pythonic如果翻译成中文的话就是很python。很+名词结构的用法在中国不少,比如:很娘,很国足,很CCTV等等。 我的理解为,很+名词表达了一种特殊和强调的意味。
某些 Prolog 目标的确定性成功问题已经一次又一次地出现在 - 至少 - 以下问题: Reification of term equality/inequality Intersection an
我指的是 DateTime.TryParse(string s, out DateTime result) 重载,它尝试从字符串中解析 DateTime - 没有特定的格式正在指定。 我可以从http
2020 年 04 月 10 日,《中共中央国务院关于构建更加完善的要素市场化配置体制机制的意见》正式公布,将数据确立为五大生产要素(土地、资本、劳动力以及技术)之
有人可以解释一下 NSNotification 的 addObserver 函数中 notificationSender 的用途吗? 这是 Apple 文档的解释: notificationSende
我是一名优秀的程序员,十分优秀!