【问题标题】: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 作为这个问题的欺骗。恕我直言,这里的答案更详细。

标签: c++


【解决方案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 时有效的值!这是因为您没有有一个值的副本,只是对它的引用。)

    【讨论】:

    • 赞成;最后提出的好点。请随意提及我在回答中提到的悬空参考案例。
    • 也为你最后提出的观点点赞。
    猜你喜欢
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多