examples c++ lambda c++11

examples - std c++



¿C++ 11 lambdas captura variables que no usan? (2)

No, my_huge_vector no será capturado. [=] significa que todas las variables utilizadas se capturan en la lambda.

Cuando uso [=] para indicar que me gustaría que todas las variables locales sean capturadas por valor en una lambda, ¿dará como resultado todas las variables locales en la función que se está copiando, o solo todas las variables locales que utiliza la lambda ?

Entonces, por ejemplo, si tengo:

vector<int> my_huge_vector(100000); int my_measly_int; some_function([=](int i){ return my_measly_int + i; });

¿Se copiará my_huge_vector, aunque no lo use en el lambda?


Se captura cada variable expresamente nombrada en la lista de captura. La captura predeterminada solo capturará las variables que (a) no se nombran expresamente en la lista de captura y (b) se usan en el cuerpo de la expresión lambda. Si una variable no se nombra expresamente y no se usa la variable en la expresión lambda, entonces la variable no se captura. En tu ejemplo, my_huge_vector no se captura.

Por C ++ 11 §5.1.2 [expr.prim.lambda] / 11:

Si una expresión lambda tiene un valor predeterminado de captura asociado y su sentencia compuesta odr-usa this o una variable con duración de almacenamiento automático y la entidad odr-utilizada no se captura explícitamente, entonces se dice que la entidad utilizada odr se captura implícitamente .

Su expresión lambda tiene un valor predeterminado de captura asociado: de forma predeterminada, usted captura las variables por valor usando el [=] .

Si y solo si se usa una variable (en el sentido de la regla de una definición del término "usado") se captura implícitamente una variable. Como no se usa my_huge_vector en absoluto en el cuerpo (la "declaración compuesta") de la expresión lambda, no se captura implícitamente.

Para continuar con §5.1.2 / 14

Una entidad es capturada por copia si

  • está implícitamente capturado y el valor predeterminado de captura es = o si
  • se captura de forma explícita con una captura que no incluye un & .

Como my_huge_vector no se captura implícitamente y no se captura explícitamente, no se captura en absoluto, ni por copia ni por referencia.