我现在正在玩C++ 11,发现使用lambda作为sqlite回调的问题如下。当在lambda内部捕获一个向量变量时,我得到一个错误,说明签名不匹配。如果不在lambda中使用该变量([]
而不是[&ret]
,而不是在里面使用ret
),它可以正常工作。带/不带捕获变量的lambda之间的签名区别?
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版本是 “海湾合作委员会(XvidVideo.RU - GCC 4.6.1的i686-PC-的mingw32)4.6.1 20110625(抢鲜)” 上视窗。
为什么这会有所作为?
我想与Visual Studio 2010编译器一样的东西,它不喜欢任何形式的lambda ...有谁知道这是否是VS2010中的已知错误impl? –