Estoy jugando con C++ 11 en este momento y encontré el siguiente problema con el uso de una lambda como devolución de llamada a sqlite. Al capturar una variable vectorial dentro de la lambda, aparece un error que dice que las firmas no coinciden. Sin usar esa variable en el lambda ([]
en lugar de [&ret]
, y no usando ret
dentro), funciona bien.¿Diferencia de firma entre lambda con/sin variable capturada?
vector<SomeClass> ret;
char *err = nullptr;
int res = sqlite3_exec(db,
"some sql query, doesn't matter",
[&ret](void *unused, int argc, char **argv, char **columnName) -> int
{
ret.push_back(SomeClass());
return 0;
},
nullptr,
&err);
Este es el error que consigo:
cannot convert 'TestClass::testMethod()::<lambda(void*, int, char**, char**)>' to 'int (*)(void*, int, char**, char**)' for argument '3' to 'int sqlite3_exec(sqlite3*, const char*, int (*)(void*, int, char**, char**), void*, char**)'
versión de GCC es "gcc (XvidVideo.RU - GCC 4.6.1 i686-pc-mingw32) 4.6.1 20110625 (preliminar)" en la Windows.
¿Por qué esto hace la diferencia?
Estoy intentando lo mismo con el Visual Studio 2010 y el compilador no le gusta cualquiera de las formas de la lambda ... ¿Alguien sabe si esto es un error conocido en el VS2010 impl? –