任何 lambda 表达式都可以表示为(模板化的)结构吗
Can any lambda expression be expressed as a (templated) struct
我正在寻找一个反例来反驳任何 lambda 表达式都可以表示为(模板化)结构的说法。换句话说,可以编写一个源到源编译器,它应该能够将每个 lambda 表达式提升到任何范围之外,并将其表示为模板仿函数 class.
例如,对于最终用户来说,下面两个是等价的:
auto foo(int parm){
...
auto f = [x,&y](int z) {..};
..
return foo(parm);
}
可以表示为
template<class X, class Y>
struct Closure {
X x; Y y;
auto operator()(int z) {..};
};
auto foo(int parm) {
...
auto f = Closure<decltype(x), decltype(y)&>{x,y};
...
return f(parm);
}
这个改造总能做到吗?如果没有,是否有一个例子可以证明这一点。谢谢!
lambda 的闭包类型是具有重载 operator()
([expr.prim.lambda]/3) 的 class 类型。您描述的转换 是 每次处理 lambda 表达式时都由实现完成。
lambda 的结构和闭包并不完全相同,因为捕获的变量不需要在结构本身中。这部分是实现定义的。
我正在寻找一个反例来反驳任何 lambda 表达式都可以表示为(模板化)结构的说法。换句话说,可以编写一个源到源编译器,它应该能够将每个 lambda 表达式提升到任何范围之外,并将其表示为模板仿函数 class.
例如,对于最终用户来说,下面两个是等价的:
auto foo(int parm){
...
auto f = [x,&y](int z) {..};
..
return foo(parm);
}
可以表示为
template<class X, class Y>
struct Closure {
X x; Y y;
auto operator()(int z) {..};
};
auto foo(int parm) {
...
auto f = Closure<decltype(x), decltype(y)&>{x,y};
...
return f(parm);
}
这个改造总能做到吗?如果没有,是否有一个例子可以证明这一点。谢谢!
lambda 的闭包类型是具有重载 operator()
([expr.prim.lambda]/3) 的 class 类型。您描述的转换 是 每次处理 lambda 表达式时都由实现完成。
lambda 的结构和闭包并不完全相同,因为捕获的变量不需要在结构本身中。这部分是实现定义的。