C++ GO中的闭包与局部变量

C++ GO中的闭包与局部变量,c++,go,C++,Go,我在网站上找到了以下定义 在编程语言中,闭包(也称为词法闭包或函数) 闭包)是函数或对函数的引用以及 引用环境-存储对每个环境的引用的表 非局部变量(也称为自由变量或upvalues) 函数。[1]闭包与普通函数指针不同,它允许 函数访问这些非局部变量,即使在外部调用时也是如此 它的直接词汇范围 在所有场合都是这样吗?lambda函数(创建闭包的函数)不能在调用lambda时继续引用将在范围外的局部变量吗?这不是围棋的行为吗 附言:我仍然想知道他们为什么用“lambda”这个词 因此,我得到了

我在网站上找到了以下定义

在编程语言中,闭包(也称为词法闭包或函数) 闭包)是函数或对函数的引用以及 引用环境-存储对每个环境的引用的表 非局部变量(也称为自由变量或upvalues) 函数。[1]闭包与普通函数指针不同,它允许 函数访问这些非局部变量,即使在外部调用时也是如此 它的直接词汇范围

在所有场合都是这样吗?lambda函数(创建闭包的函数)不能在调用lambda时继续引用将在范围外的局部变量吗?这不是围棋的行为吗


附言:我仍然想知道他们为什么用“lambda”这个词

因此,我得到了答案


以下文章可能会对其他读者有所帮助

引用以下内容:

函数文本

函数文字表示匿名函数

FunctionLit=“func”函数。
func(a,b int,z float64)bool{返回a*b
函数文字可以指定给变量或直接调用

f:=func(x,y int)int{return x+y}

func(ch chan int){ch从技术上讲,lambda不捕获任何上下文。闭包“封装”(因此而得名)周围的上下文或其中的一部分,在您的引用中也称为其环境。但它们有时可以互换使用。例如,C++11 lambda一旦捕获某些上下文,从技术上讲就是闭包。(但我对GO lambdas一无所知)您可能会发现这个问题很有趣:@leemes sorry措辞不正确。只是编辑了这个问题。我不明白真正的问题。您是否询问是否可以捕获局部变量并在它们无效后调用lambda,即当周围的作用域离开时?在C++11中,这是未定义的行为(取消对已经“死”的变量的引用)。但是,您可以按值捕获(变量值复制到闭包中,因此不会取消引用)同样,不知道Go。你也可以发现我的文章对关闭有帮助:Acak,在C++中:访问内存,其中函数变量退出后的局部变量是未定义的行为。@ JNML:在C++中,lambdas可以通过值或引用来捕获变量。如果它是按值捕获的,那么当然可以在函数退出之后访问。@newacct:值没有词法作用域,因此“捕获”值不是闭包的概念(IMO)。值不被捕获,它们被赋值、传递、用作操作数等。这就是为什么我谈到“引用”注释中只有大小写。@jnml:当您通过引用捕获时,它也会被传递和赋值——它只是通过引用传递并赋值给引用类型的内部变量。无论是通过值捕获还是引用捕获,变量范围都是词法的——变量对应于co中最近的封闭范围中该名称的变量de.我想你会被这样一个事实所困扰,即当它被值捕获时,变量有两个独立的副本,一个在闭包内部,一个在闭包外部。但这与闭包的概念无关,闭包的概念是它捕获变量(不说如何捕获)。@newacct:这就是为什么最好避免定义不够明确的术语的原因“引用”。最好讨论POV(普通旧值)和POP(普通旧指针)。这样区别就很清楚了。(嗯,直到有人注意到指针也是值;-)
FunctionLit = "func" Function .
func(a, b int, z float64) bool { return a*b < int(z) }
f := func(x, y int) int { return x + y }
func(ch chan int) { ch <- ACK }(replyChan)