Ví dụ sau đây chứng tỏ vấn đề tôi gặp phải trong VC++ 2010:Quy tắc tra cứu là gì khi gọi hàm từ lambda?
class Foo
{
template<class T>
static T foo(T t) { return t; }
public:
void test()
{
auto lambda = []() { return foo(1); }; // call to Foo::foo<int>
lambda();
}
};
VC++ sản xuất: lỗi C3861: 'foo'
: nhận dạng không tìm thấy
Nếu tôi đủ điều kiện cuộc gọi đến foo: Foo::foo(1);
sau đó ví dụ này biên dịch với cảnh báo: Cảnh báo C4573: việc sử dụng 'Foo::foo'
yêu cầu trình biên dịch bắt giữ 'this'
nhưng chế độ chụp mặc định hiện tại không cho phép
Tiêu chuẩn nói gì về trường hợp này? Tên không đủ tiêu chuẩn được tìm thấy? Tên đủ điều kiện có yêu cầu chụp this
không?
Hm, thật kỳ lạ. Đó là tĩnh, vì vậy nó không nên yêu cầu 'này'. Tôi nghi ngờ đó là lỗi trình biên dịch và không tìm thấy nó là tác dụng phụ của trình biên dịch nghĩ rằng nó cần 'này' để sử dụng nó. –
Điều này xảy ra với g ++ cũng vì vậy nó không có vẻ giống như một lỗi. Nếu bạn thay đổi nó thành [&]() thay vì []() thì điều này sẽ biên dịch tốt nhưng đó là bởi vì nó lấy điều này bằng cách tham chiếu. – DrYap
Có nói rằng [thread khác] (http://stackoverflow.com/questions/4940259/c0x-lambdas-require-capturing-this-to-call-static-member-function) nói rằng đó là một lỗi. – DrYap