Возможный дубликат:
Рекурсивные лямбда-функции в С++ 0x
Почему я не могу назвать лямбда рекурсивно, если я напишу его как:
auto a = [&]
{
static int i = 0; i++;
std::cout << i << std::endl;
if (i<10)
a(); //recursive call
};
Он дает ошибку компиляции (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
Что означает ошибка?
Я понимаю причину, по которой я не могу написать это:
auto i=i+1; //error: unable to deduce 'auto' from '<expression error>'
Мы не можем записать это, потому что из него следует выводить тип i
, что означает, что тип не может быть выведен, если сама строка i
появляется в инициализации (ideone). Но как это важно в случае лямбда? Если я не ошибаюсь, тип лямбда определяется его параметрами (-ами) и типом возврата; он не зависит от тела, если он ничего не возвращает (в этом случае тип возврата выводится как void
, независимо от других утверждений в лямбда-теле).
Во всяком случае, у меня есть обходной путь, и я могу использовать std::function
вместо:
std::function<void()> a = [&]
{
static int i = 0; i++;
std::cout << i << std::endl;
if (i<10)
a();
};
которые компилируют штрафы (ideone). Но мне все еще интересно узнать, почему версия auto
не компилируется.