El estándar de C++ 11 dice (o al menos, la versión que tengo - no el final):¿Por qué la "lambda implícita para funcionar la conversión del puntero" prohíbe la captura "por referencia" de miembros estáticos?
El tipo de cierre para un lambda-expresión con sin lambda-captura tiene un pública la función de conversión const non-virtual no-virtual al puntero para funcionar teniendo el mismo parámetro y tipos de retorno que el operador de llamada de función del tipo del cierre.
Entiendo por qué no es posible obtener un puntero de función de un lambda con estado dado que un puntero de función no puede contener ningún dato por sí mismo.
Pero cuando los objetos capturados son solo miembros estáticos/variable estática, no existe tal limitación ya que las referencias a los objetos capturados se pueden cablear en la función misma.
struct A {
static int count = 0;
void foo() {
static int bar = 0;
auto fun = [&]()->void {
count++;
bar++;
};
void(*ptrFun)();
ptrFun = fun; // forbidden by the quoted wording
}
};
¿Por qué no siempre es posible convertir un lambda en un puntero de función tan pronto como el primero no tiene estado? ¿Me estoy perdiendo algo o el comité olvidó este punto específico?
Supongo que es para evitar que los compiladores puedan probar mucho sobre lo que se está capturando. – Flexo
El compilador ya puede capturar variables automáticamente tan pronto como se utilizan (usando el [&] automático), por lo que no requerirá mucho más trabajo verificar si son miembros estáticos o globales, ya que necesariamente sido declarado antes –
En realidad, no lo he probado en ningún compilador (solo tengo MSVC10 que no admite ninguna conversión de puntero a función). ¿Supongo que es una extensión de GCC? De todos modos, mi pregunta es: está permitido por el estándar (tal vez me perdí algo)? Si no, ¿por qué está prohibido (tal vez haya una limitación técnica que desconozco)? –