我正在寻找一个反例来反驳任何lambda表达式可以表示为(模板化)结构的说法。换句话说,可以编写一个源到源编译器,它应该能够将每个lambda表达式从任何范围中提升出来并将其表达为模板化的仿函数类。
例如,就最终用户而言,以下两个是等效的:
declare
cursor rec_tab is select table_name, COUNT(column_name) columns
from user_tab_columns
group by table_name;
num_row number(6);
begin
for ind_tab in rec_tab loop
execute IMMEDIATE 'select COUNT(*) from '||ind_tab.table_name into num_row;
dbms_output.put_line
(RPAD(ind_tab.table_name,30)||' '||RPAD(ind_tab.columns,6)||num_row);
end loop;
end;
/
可以表示为
auto foo(int parm){
...
auto f = [x,&y](int z) {..};
..
return foo(parm);
}
这种转变总能完成吗?如果没有,是否有一个例子可以证明这一点。谢谢!
答案 0 :(得分:4)
lambda的闭包类型是一个带有重载public func request(URLRequest: URLRequestConvertible) -> Request {
print("Started request: \(URLRequest.URLRequest)")
....
([expr.prim.lambda]/3)的类类型。每次处理lambda表达式时,都会通过实现来完成所描述的转换。
答案 1 :(得分:0)
lambda的结构和闭包不是完全等价的,因为捕获的变量不需要在struct本身中。这部分是实现定义。