Рассмотрите эту довольно бесполезную программу:
#include <iostream>
int main(int argc, char* argv[]) {
int a = 5;
auto it = [&](auto self) {
return [&](auto b) {
std::cout << (a + b) << std::endl;
return self(self);
};
};
it(it)(4)(6)(42)(77)(999);
}
В основном мы пытаемся сделать лямбду, которая возвращается сама.
- MSVC компилирует программу, и она запускается
- gcc компилирует программу, и она segfaults
- clang отклоняет программу сообщением:
error: function 'operator()<(lambda at lam.cpp:6:13)>' with deduced return type cannot be used before it is defined
Какой компилятор прав? Существует ли ограничение статического ограничения, UB или нет?
Обновление этой незначительной модификации принято clang:
auto it = [&](auto& self, auto b) {
std::cout << (a + b) << std::endl;
return [&](auto p) { return self(self,p); };
};
it(it,4)(6)(42)(77)(999);
Обновление 2: я понимаю, как написать функтор, который возвращает себя или как использовать комбинатор Y, для достижения этого. Это вопрос языка-юриста.
Обновление 3: вопрос заключается не в том, является ли законным для лямбда возвращение вообще, а в отношении законности этого конкретного способа сделать это.
Связанный с этим вопрос: C++ lambda возвращается сам.