在抽象中:
int i = 1;
auto go = [] () {
return i;
};
是否有可能在现代C ++语法中做出类似的东西?
答案 0 :(得分:33)
从形式上讲,访问周围环境的能力是功能(不能)和闭包(可以)之间的关键区别。根据语言,环境的 capture 可能通过复制或引用发生。
在C ++ 11(及更高版本)中,lambdas是闭包,和C ++一样,我们有一种细粒度的方式来指定 捕获的完成方式:
[=]() { return i; }
或明确[i]() { return i; }
[&]() { return i; }
或明确[&i]() { return i; }
和C ++ 14甚至引入了广义lambda捕获,因此您可以捕获:
[i = std::move(i)]() { return i; }
[i = 1]() { return i; }
方括号分隔捕获列表。
答案 1 :(得分:6)
当然,取决于您是否想要按值捕获它:
auto go = [i] () {
return i;
};
或参考:
auto go = [&i] () {
return i;
};
答案 2 :(得分:3)
只需将其放入捕获部分:
auto go = [i] () {
return i;
};