C++ lambda表达式(MSVC+;+;vs g+;+;)

C++ lambda表达式(MSVC+;+;vs g+;+;),c++,visual-c++,lambda,c++11,visual-c++-2010,C++,Visual C++,Lambda,C++11,Visual C++ 2010,我有以下代码 #include <algorithm> #include <iostream> #include <vector> #include <functional> int main() { typedef std::vector<int> Vector; int sum=0; Vector v; for(int i=1;i<=10;++i) v.push_back(i); std:

我有以下代码

#include <algorithm>
#include <iostream>
#include <vector>
#include <functional>


int main()
{
  typedef std::vector<int> Vector; 
  int sum=0;
  Vector v;
  for(int i=1;i<=10;++i)
     v.push_back(i);

  std::tr1::function<double()>  l=[&]()->double{

    std::for_each(v.begin(),v.end(),[&](int n){sum += n; //Error Here in MSVC++});
    return sum;
     };

  std::cout<<l();
  std::cin.get();
}
#包括
#包括
#包括
#包括
int main()
{
typedef std::向量;
整数和=0;
向量v;
对于(int i=1;i加倍{
std::for_each(v.begin()、v.end()、[&](int n){sum+=n;//MSVC++}中的错误;
回报金额;
};

std::cout我认为您可能必须在
sum
上明确声明闭包,如下所示:

std::for_each(v.begin(),v.end(),[&sum](int n){sum += n;});

一般来说,应该允许您在本地范围内隐式捕获变量,但前提是lambda保证在同一范围内运行。可能是因为您将lambda分配给一个函数var,然后再执行它(而不是直接运行它),MSVC不够聪明,无法理解该条件是否成立-毕竟,您可能会传递
l
并在其他一些范围内执行它-因此它需要显式的捕获声明。

无论VC是对是错,在(外部)范围外声明sum都是不好的样式lambda。由于您返回sum的值,因此无需在循环内更改外部变量的值。相反,您应该具有:

int sum = 0;
std::for_each(v.begin(),v.end(),[&](int n){sum += n;});
return sum;

<> P>这可能是嵌套的lambdas也混淆了VC。我认为,嵌套lambda是多余的,并且使代码变得不可读。

你是否已经尝试编译问题中的代码?Visual C++ 2010接受代码,就像(明显删除注释)一样,并且成功编译代码没有错误。 您看到的“错误”不是编译错误,而是IntelliSense错误。IntelliSense错误检查会导致大量误报(我在过去几个月报告了Microsoft Connect上的几个错误);在这种情况下,IntelliSense错误地说这是一个错误,而事实并非如此

您有两个选项:可以忽略IntelliSense误报,也可以禁用IntelliSense错误检查(右键单击错误列表窗口并取消选中“显示IntelliSense错误”)


不管怎样,这些智能感知错误都不会阻止编译的成功。

我认为你唯一的问题是蚂蚁大小的红波。。。。 由于微软早些时候发布了编译器,很快标准机构就改变了名称查找的规则……因此intellisense不是最新的

所以试着用这个想法来打击…宝贝

#include <algorithm>
#include <iostream>
#include <vector>
#include <functional>


int main()
{
  typedef std::vector<int> Vector; 
  int sum=0;
  Vector v;
  for(int i=1;i<=10;++i)
     v.push_back(i);

  std::tr1::function<double()>  l=[&]()->double{
      int *y; y=&sum;
      std::for_each(v.begin(),v.end(),[&](int n){*y += n; });
    return sum;
     };

  std::cout<<l();
  std::cin.get();
}
#包括
#包括
#包括
#包括
int main()
{
typedef std::向量;
整数和=0;
向量v;
对于(int i=1;i加倍{
int*y;y=&sum;
std::for_each(v.begin(),v.end(),[&](int n){*y+=n;});
回报金额;
};

std::coutVS10 Does有一些已知的与lambda捕获范围相关的bug,som最有可能GCC在本例中是正确的。只需下载一个最新的标准草案-在Google上查找“c++标准”,您会给您一个链接。查看它是一个有趣的学习体验:)注意,最新的草案是FCD,N3092,您可以(警告:10.5MB PDF)。@James:谢谢你提供的信息和链接;-)。我已经得到了答案并解决了我的问题。顺便说一句,这里不需要使用原始指针。即使是对sum的引用也可以解决问题。顺便说一句,您可以关闭
显示智能感知错误
选项。我希望您知道这一点。但是,代码在技术上是正确的,因此我在这里也提到了:如果您的代码是技术性的很正确,我找不到在论坛上发布这些愚蠢错误的理由……我认为如果你是一个好的程序员,你就不会在公共场合大发雷霆,所以所有的狗都会跟着你跑(类似于这个论坛的成员)…他们尝试讨论而不是帮助……。这不是一个讨论论坛,而是一个问答网站。起初我不确定MSVC++中代码的有效性,但在阅读了James的回答后,我意识到错误只是一个intellisense错误,我的代码完全有效。我可以自由地做任何我想做的事情。如果你不知道,我可以ke my question(或answer)不要发布你的答案/评论。这根本不是必需的。
他们尝试讨论事情而不是帮助解决问题。
主观和补充性的问题会立即关闭。你似乎是这个网站的新手。