C ++ lambda表达式无法编译

时间:2011-05-07 21:22:41

标签: c++ c++11 compiler-errors lambda

我正在使用lambda表达式尝试cin循环索引中的循环索引值:

#include<iostream>
using namespace std;

int main(){
  for(int a, ([](int & b){cin>>b;})(a); a < 2; ++a);
  return 0;
}

当我在ubuntu上使用g ++ 4.5进行编译时,这些是错误:

forLoopAndCinTest.c++: In function ‘int main()’:
forLoopAndCinTest.c++:5:14: error: expected unqualified-id before ‘[’ token
forLoopAndCinTest.c++:5:14: error: expected ‘)’ before ‘[’ token
forLoopAndCinTest.c++:5:34: error: expected primary-expression before ‘)’ token
forLoopAndCinTest.c++:5:34: error: expected ‘;’ before ‘)’ token
forLoopAndCinTest.c++:5:40: error: name lookup of ‘a’ changed for ISO ‘for’ scoping
forLoopAndCinTest.c++:5:40: note: (if you use ‘-fpermissive’ G++ will accept your code)
forLoopAndCinTest.c++:5:50: error: expected ‘;’ before ‘)’ token

如果我使用普通函数而不是lambda,程序编译就好了  使用-fpermissive也没有帮助。
 有什么想法吗?

3 个答案:

答案 0 :(得分:5)

这不是for看起来如何运作的。您正在尝试调用lambda,编译器希望您在其中声明int

for( int a, int2, ...; a < 2; ++a );

现在,

  

如果我使用普通功能而不是   lambda,程序编译好

是的,但它可能没有按照你的想法做到。

void f(int& b)
{
    cin >> b;
}

// ...
for( int a, f(a); a < 2; ++a );

此处,循环声明了两个名为inta f 变量。该循环不会像您期望的那样调用f()

请改为尝试:

for( int a; cin >> a && a < 2; ++a );

答案 1 :(得分:2)

for 的第一部分被解释为声明。使用(几乎)等效代码替换代码时会出现同样的错误:

int main(){
    int a, ([](int & b){cin>>b;})(a); // This produces the same error
    for(; a < 2; ++a);
    return 0;
}

要回答您所做的评论,for (int a, foo() ; ...有效,但不像您认为的那样。事实上,它声明了一个返回int的函数(在for scope中),并且名称为 foo 。如:

int a, foo();

你应该读作:

int a;
int foo();

答案 2 :(得分:0)

在此之后:for( int a,编译器需要一些名称(变量的) - unqualified-id。 但在你的情况下并非如此。