c ++ [&]运算符

T-s*_*ent 11 c++ c++11

您好我在Windows文档中找到了此代码

但我没有得到什么意思

[&]
Run Code Online (Sandbox Code Playgroud)

只是请你能清楚我该怎么办?

它不是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;
      }
   });
}
Run Code Online (Sandbox Code Playgroud)

hmj*_*mjd 20

它是C++ 11的一个特性,称为lambda capture子句.在这种情况下,[&]lambda函数可用于函数的所有参数parallel_matrix_multiply().

有关更多信息,请参阅lambda函数.


pmr*_*pmr 14

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

例:

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


For*_*veR 9

它是C++11标准的特征.拉姆达


Sin*_*all 6

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

[&X, =]
Run Code Online (Sandbox Code Playgroud)

表示lambda将X通过引用获取变量,而所有其他变量则按值.


小智 5

[&]意味着你可以访问lambda表达式中周围代码的变量,并且可以通过referenc访问它(即你可以修改它们).在示例代码中,您可以看到它m1, m2, resultsize在lambda experssion中使用,即使它们不作为参数传递.

  • 从技术上讲,你不能以任何方式修改变量,因为没有明确指定为`mutable`的lambdas有一个`const``manitor()`,因此捕获的变量不能被改变.对于`mutable` lambdas,变量可以在两种情况下都改变,但是变化在lambda之外是可见的,仅用于通过引用捕获 (2认同)