【问题标题】:c++ [&] operator [duplicate]c ++ [&]运算符[重复]
【发布时间】:2012-09-04 10:55:07
【问题描述】:

你好,我在 windows 文档中找到了这段代码

但我不明白是什么意思

[&]

请问你能告诉我它应该做什么吗??

这不是 c++ 标准吗?

这是代码:

void parallel_matrix_multiply(double** m1, double** m2, double** result, size_t size)
{
   parallel_for (size_t(0), size, [&](size_t i)
   {
      for (size_t j = 0; j < size; j++)
      {
         double temp = 0;
         for (int k = 0; k < size; k++)
         {
            temp += m1[i][k] * m2[k][j];
         }
         result[i][j] = temp;
      }
   });
}

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    它引入了一个 lambda 表达式。方括号的内容 指示要在 lambda 中捕获的内容。只有&amp; 在那里意味着 lambda 中提到的所有内容和 可以在其范围之外找到的都是通过引用捕获的。

    例子:

    int a = 0;
    auto l = [&]() { 
      ++a; // a refers to the a outside of this scope through a reference
    }
    l(); // execute the lambda
    

    【讨论】:

    • 这是一个很好的例子...我喜欢函数内的 Comment 它更清楚 & 的含义
    • 因此,如果我写 [=] 并编辑 a 变量,那么在 lambda 函数之外,值会改变吗?还是不是因为没有通过引用传递?
    • @frank:如果您只是将 & 更改为 =,它将无法编译,因为您无法更改复制的变量,除非您明确表示您打算使用 mutable 关键字这样做。
    • 感谢答案,但最终在 lambda 执行之后,当 a 是可变的时,值不会改变吗?
    【解决方案2】:

    这是一个 C++11 特性,被称为 lambda 捕获子句。在这种情况下,[&amp;] 通过引用将 parallel_matrix_multiply() 函数的所有参数提供给 lambda 函数。

    更多信息请参见lambda functions。

    【讨论】:

    • "通过引用 lambda 函数使parallel_matrix_multiply() function 的所有参数可用"?
    • @SteveJessop,[&amp;] 使作用域内的所有变量都可以通过引用在 lambda 函数的主体中使用,包括函数 parallel_matrix_multiply() 的参数。这是不正确的还是只是措辞混乱?
    • 是正确的(据我了解:我不知道是否有任何令人困惑的边缘情况)。我的评论只是想让这句话不那么笨拙,如果我没有传达出来,请见谅。
    【解决方案3】:

    这是C++11 标准的特征。 lambda

    【讨论】:

      【解决方案4】:

      这是用于 lambda 表达式的捕获子句。 lambda 表达式可以访问其封闭范围内的所有变量(即,如果 lambda 在函数内,它可以访问该函数内的所有变量)。 [&amp;] 表示 lambda 将通过引用获取所有变量。它们也可以按值,在这种情况下,您可以使用[=]。您还可以指定需要以特定方式获取的具体变量,例如此代码:

      [&X, =]
      

      表示 lambda 将通过引用获取 X 变量,并通过值获取所有其他变量。

      【讨论】:

      • 所以如果我写 [=] 并编辑一个变量....那么在 lambda 函数之外,值会改变吗?我想不是……对吧?
      • @frank,是的,如果你写 [=],无论你做什么,lambda 之外的值都将保持不变。
      • 相当于将变量按值传递给常规函数:调用者的副本不会改变。您可以通过一个玩具示例自己轻松地确认这一点。
      • 如果我错了,请纠正我,但根据here,lambda 函数默认情况下 no 访问其封闭范围的变量。
      【解决方案5】:

      [&] 意味着您可以从 lambda 表达式中的周围代码访问变量,并且可以通过引用访问(即您可以修改它们)。在示例代码中,您可以看到 m1, m2, result 和 size 在 lambda 表达式中使用,即使它们没有作为参数传递。

      【讨论】:

      • 从技术上讲,您不能以任何一种方式修改变量,因为未明确指定为 mutable 的 lambda 具有 const operator(),因此无法更改捕获的变量。对于mutable lambdas,变量在两种情况下都可以更改,但是更改在 lambda 外部可见,仅用于通过引用捕获
      【解决方案6】:

      这是一个 Lambda 函数,C++ 11 功能

      [&](size_t i){...}
      

      将像回调或仿函数一样工作。所以你不需要在其他地方写另一个函数来传递给parallel_for。

      【讨论】:

        猜你喜欢
        • 2012-12-22
        • 2016-09-26
        • 2012-04-21
        • 1970-01-01
        • 1970-01-01
        • 2021-02-23
        • 2015-09-18
        • 2017-03-10
        • 2011-12-24
        相关资源
        最近更新 更多