2012-09-04 24 views
10

hola he encontrado este código en la documentación de WindowsC++ [&] operador

pero que no entiendo lo que significa

[&] 

simplemente por favor me puede aclarar lo que debe hacer ??

no es C++ estándar cierto?

Este es el código:

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; 
     } 
    }); 
} 

Respuesta

16

Es una característica de C++ 11 y se llama la cláusula lambda de captura. En este caso, el [&] pone a disposición de la función lambda todos los argumentos para la función parallel_matrix_multiply() por referencia.

Consulte lambda functions para obtener más información.

+0

"hace que todos los argumentos de la función' parallel_matrix_multiply()' estén disponibles por referencia a la función lambda "? –

+1

@SteveJessop, '[&]' hace que todas las variables en el alcance estén disponibles en el cuerpo de la función lambda por referencia, incluidos los argumentos de la función 'parallel_matrix_multiply()'.¿Es esto incorrecto o está redactado de manera confusa? – hmjd

+0

Es correcto (por lo que yo lo entiendo: no sé si hay casos de bordes confusos). Mi comentario solo intentaba hacer la frase un poco menos pesada, lo siento si no lo transmití. –

4

Esta es una función Lambda, C++ característica 11

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

actuará como una devolución de llamada o funtor. Por lo tanto, no necesita escribir otra función en otro lugar para pasar a parallel_for.

12

Introduce una expresión lambda. El contenido de los corchetes indica qué debe capturarse dentro de la lambda. Tener solo un & allí significa que todo lo que se menciona dentro de la lambda y se puede encontrar fuera de su alcance se captura por referencia.

Ejemplo:

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

este es un buen ejemplo ... me gusta el Comentario dentro de la función que hace más claro el & significado –

+0

Entonces, si escribo [=] y edito una variable, ¿entonces, fuera de la función lambda, se cambia el valor? o no es porque no fue pasado por referencia? –

+0

@frank: si solo cambia & = no se compilará porque no puede mutar las variables copiadas a menos que explícitamente indique que tiene la intención de hacerlo con la palabra clave mutable. – sellibitze

5

Esta es la cláusula de captura utilizado para expresiones lambda. Una expresión lambda puede tener acceso a todas las variables de su ámbito circundante (es decir, si la lambda está dentro de una función, puede tener acceso a todas las variables dentro de esa función). El [&] significa que la lambda obtendrá todas las variables por referencia. También se pueden tomar por el valor, en ese caso usaría [=]. también puede especificar las variables concretas que deben ser tomadas de manera específica, por ejemplo, este código:

[&X, =] 

lambda significa que tomará la variable X por referencia, y todos los demás términos de valor.

+0

Entonces, si escribo [=] y edito una variable ... ¿entonces, fuera de la función lambda, se cambia el valor? supongo que no ... ¿verdad? –

+0

@frank, sí, si escribe [=], el valor fuera de la lambda seguirá siendo el mismo, haga lo que haga. – SingerOfTheFall

+0

Es equivalente a pasar una variable por valor a una función normal: la copia de la persona que llama no cambia. Puede confirmarlo fácilmente con un ejemplo de juguete. – Useless

5

[&] significa que tendrá acceso a las variables del código circundante dentro de la expresión lambda, y se accederá por referencia (es decir, puede modificarlas). En el código de ejemplo, puede ver que m1, m2, result y size se usan en lambda experssion aunque no se pasen como parámetros.

+2

Técnicamente, no se pueden modificar las variables de ninguna manera, ya que las lambdas que no se especifican explícitamente como 'mutable' tienen un operador' const' '()', por lo que las variables capturadas no pueden modificarse. Para lambdas 'mutables', las variables se pueden cambiar en ambos casos, sin embargo, el cambio es visible fuera de la lambda solo para la captura por referencia – Grizzly