任何 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 的结构和闭包并不完全相同,因为捕获的变量不需要在结构本身中。这部分是实现定义的。