visual studio 2010-C++中的嵌套Lambda捕获
visual studio 2010 - Nested Lambda Capture in C++
我有这样的东西:
// think of Synonym as a set/vector of values
// the purpose of this function is to filter out elements from the 2 synonyms/sets,
// that are not related (similar to SQL inner join) - modifier modifies vars
void Clauses::modifies(Synonym& modifiers, Synonym& modifiedVars, UnaryPredicate isModifies) {
// filter out any modifiers that does not modify (is related to) any of the variables in modifiedVar (left join)
modifiers.removeIf([modifiedVars, &isModifies](int line) -> bool {
return modifiedVars.none([line, &isModifies](int v) -> bool {
return isModifies(line, v);
});
});
// filter out any candidate modifiedVars that is not modified by any modifiers (right join)
modifiedVars.removeIf([modifiers, &isModifies](int varIndex) -> bool {
return modifiers.none([varIndex, &isModifies](int line) -> bool {
return isModifies(line, varIndex);
});
});
// result is an something like an SQL inner join
}
问题是Visual Studio抱怨:
Error 1 error C3480: 'PQL::Clauses::`anonymous-namespace'::<lambda1>::isModifies': a lambda capture variable must be from an enclosing function scope h:dropboxschcs3202spa_cppspapql.cpp 78
Error 2 error C2665: 'PQL::Clauses::`anonymous-namespace'::<lambda3>::<lambda3>' : none of the 2 overloads could convert all the argument types h:dropboxschcs3202spa_cppspapql.cpp 78
...
最初,代码不将谓词/条件作为引用传递,但读到某个地方时我认为我需要它,但它似乎没有改变任何
modifiers.removeIf([modifiedVars, isModifies] ...
更新:我正在为这个项目使用VS2010
如果您使用的是Visual Studio 2010,您的代码可能会触发一个错误,该错误不允许您捕获嵌套lambda中的变量。
尝试使用默认捕获模式(例如[&])作为解决方法。
此错误已在VS2012中修复。
这似乎是一个Visual C++错误,因为GCC和Clang接受了这个捕获。这里有一个变通方法:
modifiedVars.removeIf([modifiers, &isModifies](int varIndex) -> bool {
auto& isModifiesRedirect = isModifies;
return modifiers.none([varIndex, &isModifiesRedirect ](int line) -> bool {
return isModifiesRedirect (line, varIndex);
});
注意:我只能在VS2010上测试这个。它可能在VS2012中被修复。如果还不是已知问题,您可能需要考虑搜索Microsoft Connect并提交新错误。
相关文章:
- Lambda 捕获、初始值设定项和嵌套结构
- 在嵌套 lambda 的情况下如何初始化 lambda 捕获?
- 是否可以指定 C++20 个模板化 lambda 来推断嵌套在参数中的类型?
- 修改嵌套 lambda 中捕获的参数:gcc 与 clang?
- 重构嵌套绑定以使用 lambda 函数
- 通过嵌套的lambda中的值捕获指针导致Segfault
- 为什么这个嵌套的 lambda 不被认为是 constexpr?
- 嵌套的 lambda 函数
- 如何更新嵌套lambda功能(C )中的变量
- 嵌套模板功能中的C 0x lambda参数
- 嵌套C lambda功能的标题
- 嵌套的lambda表达式在用Visual C++编译和生成巨大的对象文件时速度非常慢
- 嵌套Lambda捕获问题
- c++11嵌套lambda编译segfault
- 使用嵌套lambda时出现奇怪的编译错误
- 在嵌套 Lambda 中捕获 Lambda 的静态
- 增强MPL嵌套lambda
- visual studio 2010-C++中的嵌套Lambda捕获
- Visual Studio中的嵌套Lambda
- visual studio 2010-C++在VS2010中使用lambda参数捕获嵌套lambda错误