为什么C++11和PHP闭包需要声明闭合变量?

7

C++和PHP中的函数字面值要求程序员指定它们从当前词法上下文中使用哪些变量。这个要求背后的原因是什么呢?

我猜这不是为了编译器/解释器,因为可以从函数字面值的主体静态推断出这些信息。难道只是为了吸引读者的注意力吗?

2个回答

10

至少对于C++11来说,[=] () {...} 会自动引入函数体使用的所有局部变量,且仅限这些变量。(或者,等价地, [&]...)

如果您需要特别指定某些变量,以按值或按引用进行捕获,那么可以超越此总括性规则。

在PHP中,变量在首次使用它们的名称时被创建,因此我认为声明是为了确保没有新变量掩盖旧变量。有点像global关键字。


好的,在PHP的情况下(几乎)有意义。 - Aivar
这一切都与C++的控制有关。我喜欢它如何让你控制你的闭包。 - bstamour
2
@bstamour -- 的确,明确指定哪些变量被捕获的能力可能对防止 无意中 捕获变量很有用(比如,使用从其他地方复制粘贴的长表达式),当然,在通过引用进行捕获时尤其重要... - snogglethorpe

0

嗯,我不能确定PHP方面的情况,也没有完全理解你的问题 - 但是在C++中,变量total可以参与lambda函数闭包。这个主要前提是它可以改变自己的值,因为它是一个引用。


1
后现代主义生成器似乎拥有一个SO账户。 - spraff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接