Разница в сигнатуре лямбда с / без захваченной переменной?

Я сейчас экспериментирую с C ++ 11 и обнаружил следующую проблему с использованием лямбды в качестве обратного вызова sqlite. При захвате векторной переменной внутри лямбды я получаю сообщение об ошибке, что подписи не совпадают. Без использования этой переменной в лямбда-выражении ([] вместо [& ret] и без использования ret внутри) он работает нормально.

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);

Я получаю следующую ошибку:

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**)'

Версия GCC - «gcc (XvidVideo.RU - GCC 4.6.1 i686-pc-mingw32) 4.6.1 20110625 (предварительная версия)» в Windows.

Почему это имеет значение?

6
задан AndiDog 26 August 2011 в 21:38
поделиться