2012-02-28 13 views
18

Supongamos que uso una lambda como función de devolución de llamada, y cuando creo la lambda, capturo una variable de función local por referencia. Ahora supongamos que el objeto lambda no se ejecuta hasta que la variable de función local se salga del alcance. ¿Lo que pasa?¿Qué sucede si capturo una variable local por referencia y sale del alcance?

Me doy cuenta de que sería muy estúpido que alguien lo haga si existe la posibilidad de que ocurra, pero estoy casi seguro de que alguien terminará haciéndolo.

+0

No estoy familiarizado con C++ 11, pero para cualquier otro idioma que he usado, capturar la variable por definición significa que no queda fuera del alcance mientras se capture (hay [ referencias indirectas). –

+8

No en C++. Devolver una lambda que capture una variable local por referencia significa que la referencia ya no será válida una vez que la función envolvente regrese. Comportamiento indefinido. –

+0

Las funciones en sí mismas son estáticas y, por lo tanto, siempre válidas. Pero un 'void (**)()' * puede * convertirse en colgante. ¿Qué más? –

Respuesta

16

Sí, eso estaría siguiendo una referencia colgante. Parece que le preocupa el diseño de la interfaz: "Estoy casi seguro de que alguien terminará haciéndolo". Por favor, no rechace lambdas y std::function sobre esta base, ya que no son más peligrosos que cualquier otra alternativa. Lambdas es simplemente una forma más simple de definir funtores locales. std::function es la mejor interfaz para funtores persistentes, polimórficos, lambda o no.

El problema de alcance es por qué es más fácil de capturar por valor. El usuario no obtendrá una referencia a menos que escriba &. Por supuesto, el peligro es que alguien tenga el hábito de iniciar todas sus funciones lambda con [&], ya que las referencias son "más rápidas". Con suerte, cualquiera de esas personas aprenderá su lección lo suficientemente pronto ... aunque algunas personas con puntero son simplemente incorregibles.

12

Lo mismo que sucede cuando devuelve una referencia a una variable local: comportamiento indefinido.

Cuestiones relacionadas