C++ c++;如果lambda

C++ c++;如果lambda,c++,lambda,C++,Lambda,下面的代码有什么问题?如果结构的第一个成员等于0,则应该在结构列表中查找元素。编译器抱怨lambda参数不是谓词类型 #include <iostream> #include <stdint.h> #include <fstream> #include <list> #include <algorithm> struct S { int S1; int S2; }; using namespace std; int

下面的代码有什么问题?如果结构的第一个成员等于0,则应该在结构列表中查找元素。编译器抱怨lambda参数不是谓词类型

#include <iostream>
#include <stdint.h>
#include <fstream>
#include <list>
#include <algorithm>

struct S
{
    int S1;
    int S2;
};

using namespace std;

int main()
{
    list<S> l;
    S s1;
    s1.S1 = 0;
    s1.S2 = 0;
    S s2;
    s2.S1 = 1;
    s2.S2 = 1;
    l.push_back(s2);
    l.push_back(s1);

    list<S>::iterator it = find_if(l.begin(), l.end(), [] (S s) { return s.S1 == 0; } );
}
#包括
#包括
#包括
#包括
#包括
结构
{
int S1;
int S2;
};
使用名称空间std;
int main()
{
清单l;
s1;
s1.s1=0;
s1.S2=0;
s2;
s2.S1=1;
s2.s2=1;
l、 推回(s2);
l、 推回(s1);
list::iterator it=find_if(l.begin(),l.end(),[](S){返回S.S1==0;});
}

代码在VS2012上运行良好,只有一个建议,通过引用传递对象而不是通过值传递:

list<S>::iterator it = find_if(l.begin(), l.end(), [] (const S& s) { return s.S1 == 0; } );
list::iterator it=find_if(l.begin(),l.end(),[](const S&S){return S.S1==0;});

我刚刚用g++4.6.3编译了您的代码,一切都可以正常编译。这里没有错误消息。您使用的是哪种编译器?也许它还不了解lambdas。你在用什么编译器?啊哈。现在我觉得自己很愚蠢。编译器给出了一个警告:lambda表达式仅在-std=c++0x或-std=gnu++0x[默认启用]时可用。我认为这意味着它将在默认情况下启用。原来不是。我真傻。尽管如此,还是感谢您的帮助。不,这意味着实际的警告在默认情况下是启用的(而不是由某些编译器标志触发的,如
-Wall
)。我没有发现这个问题过于本地化。事实上,我甚至没有看这个问题。简单地看一眼答案就足以记住实现[&]只是想补充一点,这也适用于GCC/G++4.7。