Tôi đang chơi xung quanh với C++ 11 ngay bây giờ và tìm thấy vấn đề sau với việc sử dụng một lambda như gọi lại để sqlite. Khi chụp một biến vector bên trong lambda, tôi nhận được một lỗi nói rằng các chữ ký không khớp. Không sử dụng biến đó trong lambda ([]
thay vì [&ret]
và không sử dụng ret
bên trong), nó hoạt động tốt.Sự khác biệt chữ ký giữa lambda có/không có biến bị bắt?
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);
Đây là lỗi tôi nhận được:
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**)'
phiên bản GCC là "gcc (XvidVideo.RU - GCC 4.6.1 i686-pc-mingw32) 4.6.1 20.110.625 (phát hành trước)" trên Các cửa sổ.
Tại sao điều này tạo sự khác biệt?
Tôi đang cố gắng điều tương tự với trình biên dịch trực quan 2010 và không giống như hình thức lambda ... Có ai biết nếu đây là lỗi đã biết trong cấy VS2010 không? –