首页 > > > 闭包捕获与lazy val字段
其中一位同事对Scala不熟而对微软系技术更熟,于是我就把这个例子用C#来写了一次给他看。结果他没听说过C#里有System.Lazy<T>…不过还好C#的Lazy<T>是标准库层面的功能,毕竟magic少一些,还是比Scala的好解释一些。
C#和Scala的代码例子在这个gist里:demo C# and Scala's lazy val and lambda capturing
真正的重点是:
然后同事表示还是C++好,lambda的捕获列表很明确哪些是capture-by-value哪些是capture-by-reference。然而其实来个 [&] 就可以把按引用捕获this的事实给隐含起来了,对新手来说也没友好多少吧(ry
#include <iostream>
#include <functional>
class Foo {
int val_ = 0;
public:
std::function<int()> get_func() {
return [&]() { return val_; };
}
void incr() { val_++; }
};
int main() {
Foo foo;
const auto& f = foo.get_func();
std::cout << f() << std::endl;
foo.incr();
std::cout << f() << std::endl;
return 0;
}
让不熟悉现代C++的人来读这段代码,能看出来那个lambda隐式按引用捕获了this么 >_<
原文作者:;如有侵权,请联系管理员删除。