thể trùng lặp:
Recursive lambda functions in c++0xgọi đệ quy trong lambda (C++ 11)
Tại sao tôi không thể gọi một lambda đệ quy nếu tôi viết nó như:
auto a = [&]
{
static int i = 0; i++;
std::cout << i << std::endl;
if (i<10)
a(); //recursive call
};
Nó cung cấp lỗi biên dịch (ideone):
prog.cpp:8:18: error: '((const main()::<lambda()>*)this)->main()::<lambda()>::a' cannot be used as a function
prog.cpp: In function 'int main()':
prog.cpp:9:9: error: variable 'auto a' with 'auto' type used in its own initializer
Lỗi này có nghĩa là gì?
tôi hiểu được lý do tại sao tôi không thể viết này:
auto i=i+1; //error: unable to deduce 'auto' from '<expression error>'
Chúng ta không thể viết những dòng này vì kiểu i
phải được rút ra từ đó là khởi tạo, có nghĩa là loại không thể được suy luận nếu i
chính nó xuất hiện trong khởi tạo (ideone). Nhưng làm thế nào nó quan trọng trong trường hợp lambda? Nếu tôi không sai, kiểu lambda được xác định bởi tham số của nó và kiểu trả về; nó không phụ thuộc vào cơ thể nếu nó không trả về gì (trong trường hợp này, kiểu trả về được suy ra là void
, bất kể các câu lệnh khác trong thân lambda).
Dù sao, tôi có một cách giải quyết, và tôi có thể sử dụng thay vì std::function
như:
std::function<void()> a = [&]
{
static int i = 0; i++;
std::cout << i << std::endl;
if (i<10)
a();
};
mà biên dịch tiền phạt (ideone). Nhưng tôi vẫn muốn biết lý do tại sao phiên bản auto
không biên dịch.
Tôi nghĩ rằng vấn đề có liên quan đến bạn kết thúc với một nắm bắt ngầm của 'a', như một tham chiếu sẽ recurse vô hạn vì' a' chính nó kết thúc như là một thành viên của 'a'. – Flexo
@awoodland: Điều đó có nghĩa là gì? Xin hãy giải thích về điều đó. – Nawaz
Loại lambda cũng phụ thuộc vào ảnh chụp, mà tôi nghi ngờ là vấn đề ở đây. Nếu bạn không sử dụng 'a' thì trình biên dịch không quan tâm, nhưng khi bạn thực hiện nó không biết loại đối tượng nào cần sử dụng. –