兰姆达斯是不可变类的合成糖及其实例。有时将代码扩展到这个不可理解的类可以帮助理解正在发生的事情。
[ capture_list ](arg_list) -> return_value_clause_opt { body };
变得非常粗略地(伪代码):
struct anonymous_type {
capture_list;
auto operator()(arg_list) const -> return_value_clause_opt {
body
}
anonymous_type(capture_list_in):capture_list(capture_list_in) {}
};
如果通过其原名列出capture_list
一个变量,它是复制到匿名类中的一个副本。
所以你timesFive
成为
struct __secret_name__ {
int multiplier;
int operator()(int a) const { return a*multiplier; }
};
int multiplier = 5;
auto timesFive = __secret_name__{multiplier};
它应该很清楚的是,在上面的代码改变multiplier
不会改变timesFive
行为。
如果您在名称前加上&
,则非const
参考被放置在匿名类中。
struct __secret_name__ {
int& multiplier;
int operator()(int a) const { return a*multiplier; }
};
int multiplier = 5;
auto timesFive = __secret_name__{multiplier};
现在,改变multiplier
将改变timesFive
的行为,因为timesFive
持有参考乘法器,而不是它的复制品。
为简洁起见,上面略去了一些细节。名称__secret_name__
仅用于说明。 lamba的成员变量实际上并不公开。即使其数据是可执行定义的,也是可以构造的lambda。等
请使标题描述的问题。是的,你试图理解lambda,但是这并不能告诉我们你实际要求的东西。 (我正在考虑自己编辑它,但我不喜欢我想出来的想法。) – jpmc26