我正在使用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也没有帮助。
有什么想法吗?
答案 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 );
此处,循环声明了两个名为int
和a
的 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。
但在你的情况下并非如此。