visual variable una tipos significado que publica programacion locales globales estaticas ejemplos ejemplo declaracion c++ c++11 lambda capture

c++ - una - ¿Implica[=] que se copiarán todas las variables locales?



variables globales y locales en visual basic (2)

Cuando escribo una lambda con [=] , ¿significa que todas mis variables locales se copiarán en los miembros de la estructura creada o puedo suponer que solo esas serán realmente usadas en la lambda? Por ejemplo:

void f() { vector<int> v(10000); const int n = 5; const int DivByNCnt = count_if(istream_iterator<int>(cin), istream_iterator<int>(), [=](int i) { return i % n == 0; }); }

¿Cuál de las siguientes, si las hay, es verdadera?

  • tanto n como v se copiarán
  • n se copiará, v no
  • n se copiará, v puede o no copiarse según la configuración de implmenentation / optimization.

Supongamos, por el bien del argumento, que el constructor de copias del vector tiene efectos secundarios.


¡No! (agradecidamente)

Puede instrumentar su código para verificar si su compilador realmente lo hace (o no). Por ejemplo, gcc 4.8.0 parece ser compatible.

En cuanto a lo que el estándar realmente ordena (trabajando hacia atrás):

§5.1.2 / 14 Una entidad se captura mediante copia si se captura implícitamente y el valor predeterminado de captura = o si se captura explícitamente con una captura que no incluye un & . Para cada entidad capturada por copia, se declara un miembro de datos no estático no identificado en el tipo de cierre.

$ 5.1.2 / 11 Si una expresión lambda tiene un valor predeterminado de captura asociado y su sentencia compuesta odr-usa (3.2) this o una variable con una duración de almacenamiento automática y la entidad odr-utilizada no se captura explícitamente, entonces la odr- se dice que la entidad utilizada está implícitamente capturada ; tales entidades se declararán dentro del alcance de alcance de la expresión lambda.

§5.1.2 / 9 Una expresión lambda cuyo alcance envolvente más pequeño es un alcance de bloque (3.3.3) es una expresión lambda local; cualquier otra expresión lambda no tendrá una lista de captura en su lambda-introductor. El ámbito de alcance de una expresión lambda local es el conjunto de ámbitos de inclusión que incluye la función de delimitación más interna y sus parámetros. [Nota: este alcance de alcance incluye cualquier expresión lambda que intervenga. -finalizar nota]


No. Solo significa que todas las variables locales del ámbito ambiental están disponibles para la búsqueda dentro del cuerpo de la lambda. Solo si se hace referencia al nombre de una variable local ambiental se capturará esa variable y se capturará por valor.

Las palabras abreviadas "capturar todo" = y & son simplemente azúcar sintáctico, básicamente, diciéndole al compilador que "descubra lo que quiero decir".

Una referencia formal de 5.1.2 / 11-12:

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

Una entidad se captura si se captura explícita o implícitamente.

Tenga en cuenta que " captura por defecto " se refiere a [=] y [&] . Para repetir, especificar un valor predeterminado de captura no captura nada; solo odr-usando una variable sí lo hace.