2012-09-04 132 views
10

你好,我发现在Windows文件C++ [b]运营商

这个代码,但我不明白是什么意思

[&] 

只是请你能清楚我是什么应该做的?

它不是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; 
     } 
    }); 
} 

回答

16

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

查看lambda functions了解更多信息。

+0

“通过引用lambda函数”使'parallel_matrix_multiply()函数的所有参数“? –

+1

@SteveJessop,'[&]'通过引用使lambda函数体中的所有变量都可用,包括函数'parallel_matrix_multiply()'的参数。这是不正确的还是只是容易混淆的措词? – hmjd

+0

这是正确的(据我所知:我不知道是否有任何令人困惑的边缘情况)。我的评论只是想让这个句子变得不那么笨拙,如果我没有表达这个意思,我很抱歉。 –

4

这是一个lambda函数,C++ 11特征

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

将被用作一个回调或算符。所以你不需要在其他地方写另一个函数来传递给parallel_for。

12

它引入了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 
+0

这是一个很好的例子...我喜欢里面的评论,它使得更清晰的意义 –

+0

因此,如果我写[=]和我编辑一个变量,那么外侧的lambda函数的值改变了?或者这不是因为没有通过引用传递? –

+0

@frank:如果你只是改变&to =它不会编译,因为你不能改变复制的变量,除非你明确地表示你打算这样做mutable关键字。 – sellibitze

5

这是用于lambda表达式捕获子句。一个lambda表达式可以访问它的封闭范围的所有变量(即,如果lambda在一个函数内,它可以访问该函数内的所有变量)。 [&]表示该lambda将通过参考获得所有变量。他们也可以通过值采取,在这种情况下,你会使用[=]。你还可以指定要采取的具体方式,需要具体的变量,例如下面的代码:

[&X, =] 

意味着拉姆达将参照采取X变量,和所有其他的价值。

+0

所以,如果我写[=]和我编辑一个变量....然后ouside lambda函数的值改变?我想不是......对吧? –

+0

@frank,是的,如果你写[=],lambda以外的值将保持不变,无论你做什么。 – SingerOfTheFall

+0

这相当于将一个变量按值传递给常规函数:调用者的副本不会更改。您可以使用玩具示例轻松确认这一点。 – Useless

5

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

+2

从技术上讲,你不能以任何方式修改变量,因为未明确指定为mutable的lambda具有const操作符(),所以捕获的变量不能更改。对于'mutable' lambda,可以在两种情况下更改变量,但是只有在lambda之外才可以看到变化,以便通过引用进行捕获 – Grizzly