[&] 在函数之前是啥意思? [复制]

Posted

技术标签:

【中文标题】[&] 在函数之前是啥意思? [复制]【英文标题】:What does [&] mean before function? [duplicate][&] 在函数之前是什么意思? [复制] 【发布时间】:2017-02-08 21:22:25 【问题描述】:

以下代码是什么意思?

auto allowed = [&](int x, const std::vector<int>&vect)

....


我的意思是,[&amp;] 是做什么的?是同名变量的函数吗?

因为是这样使用的:unsigned short ok = get_allowed(0, vect);

【问题讨论】:

这是一个 lambda 的捕获列表 (c.f en.cppreference.com/w/cpp/language/lambda) 它不是一个函数,而是一个 lambda。你应该阅读那些 只是提醒一下,我关闭了this 作为这个问题的欺骗。恕我直言,这里的答案更详细。 【参考方案1】:

表示lambda函数会通过reference捕获作用域内的所有变量。

要在其中使用传递给 lambda 的变量以外的其他变量,我们可以使用 capture-clause []。 您可以通过引用和值来捕获,您可以分别使用 & 和 = 指定:

[=] 按值捕获作用域内的所有变量 [&amp;] 通过引用捕获范围内的所有变量 [&amp;var] 通过引用捕获var [&amp;, var] 指定默认 捕获方式是通过引用,我们要捕获var [=, &amp;var]默认按值捕获范围内的变量,但是使用引用捕获var 而是

【讨论】:

好点引用。赞成。 当然,至少在 C++11 中缺少的是捕获单个类成员变量的能力。在这种情况下,您必须故障转移到老式的函数对象。 正确指出,在类成员变量的情况下,我们需要捕获this指针。 这有点糟糕! @Bathsheba:仍然有解决方法:auto&amp; member_alias = this-&gt;member; auto l = [&amp;member_alias]() ...;【参考方案2】:

它是一个 lambda 捕获列表,并且已在 C++ 11 标准的 C++ 中定义。

[&amp;] 这意味着您希望通过引用 访问当前在 lambda 函数范围内的每个变量。

您的工作是确保在调用closure 时引用的对象仍在范围内,否则程序行为未定义

【讨论】:

【参考方案3】:

它定义了一个 Lambda 表达式,它基本上是一个没有名字的函数。它有参数列表(int x, const std::vector&lt;int&gt;&amp;vect) 和函数体 ... 。但它在开头[&amp;] 也有一个捕获列表。如果你想从 lambda 表达式的主体中访问一个变量(不是参数),你必须使表达式“自己取变量”,以便以后在 lambda 表达式将要使用的时候可以使用该变量执行。

您可以提供变量列表,也可以使用“all”来捕获所有变量。 [&amp;] 表示通过引用捕获所有这些,[=] 表示通过值捕获所有它们。

(如果您使用[&amp;],请注意 lambda 主体将使用 lambda 执行时的变量值,而不是创建 lambda 时有效的值!这是因为您没有有一个值的副本,只是对它的引用。)

【讨论】:

赞成;最后提出的好点。请随意提及我在回答中提到的悬空参考案例。 也为你最后提出的观点点赞。

以上是关于[&] 在函数之前是啥意思? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

后面带 () 的箭头函数是啥意思? [复制]

这个“(function());”,括号内的函数,在javascript中是啥意思? [复制]

对象/函数/类声明周围的括号是啥意思? [复制]

将对象文字包装在箭头函数中的括号是啥意思? [复制]

在 C++ 程序的主函数中,`return 0` 是啥意思? [复制]

-> 在这个函数调用的上下文中是啥意思? [复制]