Есть ли способ создать typedef
так, что будет скомпилирована следующая (базовая «чистая» реализация y-комбинатора)?Typedef для рекурсивной лямбда
typedef ??? f;
[](f x){x(x);} ([](f x){x(x);});
Это имеет эффект создания «рекурсивную лямбды», то есть один, который вызывает себя с помощью второго лямбды, чтобы получить ссылку на себя. x
в первой лямбда является ссылкой на вторую лямбду, поэтому x(x)
вызывает вторую лямбду со ссылкой на себя. После этого вторая лямбда рекурсирует, вызывая x(x)
. Этот код при выполнении должен создавать бесконечный цикл до тех пор, пока он не достигнет переполнения стека. Более сложные реализации второй функции могут приводить к произвольному рекурсивному поведению.
Я пробовал typedef
различные версии void(*)(...)
, но я не верю, что это удастся. Мое метапрограммирование шаблона недостаточно сильное, чтобы справляться с такими вещами.
Что делает 'x (x);' предполагается делать (если это возможно)? Также, что означает аргумент '([] (f x) {x (x);})'? Дайте нам представление о том, что вы делаете. – Nawaz
Просто рекурсия. Это комбинатор. – nneonneo
@nneonneo: Хорошо, я не знаю, что такое y-combinator, поэтому я думаю, что мой ответ выглядит идиотским. Должно ли это просто создать бесконечную рекурсию, позвонив себе? И разрешено ли вам определять новый класс 'X', а затем' typedef X f'? –