Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;lambda表达式不编译_C++_C++11_Compiler Errors_Lambda - Fatal编程技术网

C++ C++;lambda表达式不编译

C++ C++;lambda表达式不编译,c++,c++11,compiler-errors,lambda,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; } 如果我使用普通函数而不是lambda,则程序可以很好地编译。 使用-fpermissive也没有帮助。 有什么想法吗?在这之后:对于(int a,编译器需

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

#include<iostream>
using namespace std;

int main(){
  for(int a, ([](int & b){cin>>b;})(a); a < 2; ++a);
  return 0;
}
如果我使用普通函数而不是lambda,则程序可以很好地编译。
使用-fpermissive也没有帮助。
有什么想法吗?

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

for的第一部分被解释为一个声明。当用(几乎)等效的代码替换您的代码时,我们会遇到同样的错误:

int main(){
    int a, ([](int & b){cin>>b;})(a); // This produces the same error
    for(; a < 2; ++a);
    return 0;
}
您应将其理解为:

int a;
int foo();

这不是
for
外观的工作方式。您正在尝试调用lambda,编译器希望您在其中声明
int

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

当前C++标准没有lambda表达式,所以你指定了启用C++ 0x支持的选项吗?哦,是的,史提夫。编译时我使用-STD= C++ +0X标志。加上,如果没有使用标志,G+会抱怨。我不认为你在()中捕获变量。[]用于捕获变量。用于将参数传递给lambda。是的,它只是一个表达式列表,因此您的声明也应该有效。有趣的是,所有这些都是为了避免循环外的cin。是的,这肯定会有效。但我仍然不明白为什么我可以调用声明部分中的任何普通函数,但不能调用lambda。您不能。当您为(int a,foo();aI不理解循环如何“认为”a和f是变量,以及为什么不调用f()。如果不调用它,cin语句是如何执行的?谢谢你的最后一个习惯用法。明白了。它根本不执行函数。它只声明了一个具有适当类型的变量。顺便说一下,我得到了我想要的:for(int a,x=(cin>>a&&1;a<10;++a)。虽然必须使用额外的变量和&&O操作,但扫描for循环内的变量。但是很酷。:)
int a;
int foo();
for( int a, int2, ...; a < 2; ++a );
void f(int& b)
{
    cin >> b;
}

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