下面的代码可以用gcc 4.5.1编译,但不能用VS2010 SP1编译:
#include <iostream>
#include <vector>
#include <map>
#include <utility>
#include <set>
#include <algorithm>
using namespace std;
class puzzle
{
vector<vector<int>> grid;
map<int,set<int>> groups;
public:
int member_function();
};
int puzzle::member_function()
{
int i;
for_each(groups.cbegin(), groups.cend(), [grid, &i](pair<int,set<int>> group) {
i++;
cout << i << endl;
});
}
这就是错误:
error C3480: 'puzzle::grid': a lambda capture variable must be from an enclosing function scope
warning C4573: the usage of 'puzzle::grid' requires the compiler to capture 'this' but the current default capture mode does not allow it
1.哪个编译器是正确的?
1.如何在VS2010中使用lambda中的数据成员?
4条答案
按热度按时间kwvwclae1#
我相信VS2010这次是正确的,我会检查我是否有标准,但目前我没有。
现在,它完全像错误消息说:†
grid
不在封闭作用域中,但this
在封闭作用域中(对grid
的每次访问实际上都是在成员函数中作为this->grid
发生)。对于您的用例,捕获this
是可行的,因为您将立即使用它,而不想复制grid
但是,如果您想存储网格并复制它以供以后访问,而您的
puzzle
对象可能已经被销毁,则需要制作一个中间的本地副本:[2]我在简化--谷歌搜索“到达范围”,或者参见第5.1.2节了解所有血淋淋的细节。
af7jpaap2#
备选方案汇总:
捕获
this
:使用对成员的本地引用:
C++14:
示例:https://godbolt.org/g/dEKVGD
jv4diomz3#
我相信,你需要捕获
this
。q43xntqr4#
另一种限制lambda范围而不是让它访问整个
this
的方法是传入对成员变量的本地引用,例如。