【发布时间】:2011-08-26 21:38:38
【问题描述】:
我现在正在使用 C++11,发现使用 lambda 作为 sqlite 的回调存在以下问题。在 lambda 中捕获向量变量时,我收到一条错误消息,指出签名不匹配。如果不在 lambda 中使用该变量([] 而不是 [&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 版本在 Windows 上为“gcc (XvidVideo.RU - GCC 4.6.1 i686-pc-mingw32) 4.6.1 20110625 (prerelease)”。
为什么会有所不同?
【问题讨论】:
-
我正在用 Visual Studio 2010 编译器尝试同样的事情,它不喜欢任何一种形式的 lambda...有谁知道这是否是 VS2010 impl 中的一个已知错误?