[&] 在函数之前是啥意思? [复制]
Posted
技术标签:
【中文标题】[&] 在函数之前是啥意思? [复制]【英文标题】:What does [&] mean before function? [duplicate][&] 在函数之前是什么意思? [复制] 【发布时间】:2017-02-08 21:22:25 【问题描述】:以下代码是什么意思?
auto allowed = [&](int x, const std::vector<int>&vect)
....
我的意思是,[&]
是做什么的?是同名变量的函数吗?
因为是这样使用的: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 []
。
您可以通过引用和值来捕获,您可以分别使用 & 和 = 指定:
[=]
按值捕获作用域内的所有变量
[&]
通过引用捕获范围内的所有变量
[&var]
通过引用捕获var
[&, var]
指定默认
捕获方式是通过引用,我们要捕获var
[=, &var]
默认按值捕获范围内的变量,但是使用引用捕获var
而是
【讨论】:
好点引用。赞成。 当然,至少在 C++11 中缺少的是捕获单个类成员变量的能力。在这种情况下,您必须故障转移到老式的函数对象。 正确指出,在类成员变量的情况下,我们需要捕获this
指针。
这有点糟糕!
@Bathsheba:仍然有解决方法:auto& member_alias = this->member; auto l = [&member_alias]() ...;
【参考方案2】:
它是一个 lambda 捕获列表,并且已在 C++ 11 标准的 C++ 中定义。
[&]
这意味着您希望通过引用 访问当前在 lambda 函数范围内的每个变量。
您的工作是确保在调用closure 时引用的对象仍在范围内,否则程序行为未定义。
【讨论】:
【参考方案3】:它定义了一个 Lambda 表达式,它基本上是一个没有名字的函数。它有参数列表(int x, const std::vector<int>&vect)
和函数体 ...
。但它在开头[&]
也有一个捕获列表。如果你想从 lambda 表达式的主体中访问一个变量(不是参数),你必须使表达式“自己取变量”,以便以后在 lambda 表达式将要使用的时候可以使用该变量执行。
您可以提供变量列表,也可以使用“all”来捕获所有变量。 [&]
表示通过引用捕获所有这些,[=]
表示通过值捕获所有它们。
(如果您使用[&]
,请注意 lambda 主体将使用 lambda 执行时的变量值,而不是创建 lambda 时有效的值!这是因为您没有有一个值的副本,只是对它的引用。)
【讨论】:
赞成;最后提出的好点。请随意提及我在回答中提到的悬空参考案例。 也为你最后提出的观点点赞。以上是关于[&] 在函数之前是啥意思? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
这个“(function());”,括号内的函数,在javascript中是啥意思? [复制]