考虑一下这个相当无用的程序:
#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);
}
基本上,我们正在尝试制造一个自我返回的 λ。
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 : 问题是 没有对于一个 lambda 来说返回它自己是否合法,但是关于这种特殊方式的合法性。
相关问题: C + + lambda 返回自身。