捕获lambda无法捕获range-for循环的命名变量

时间:2018-03-09 23:36:31

标签: c++ visual-studio

Visual Studio 2015 Update 3无法使用/std:c++14编译以下代码段:

[] {
    int values[] = {1,2,3};

    for (int n : values)
    {
        [&] {
            std::cout << n << std::endl; // 'n': undeclared identifier
        }();
    }
}();

另一方面,似乎用gcc和clang编译。这是MSVC中的错误吗?什么是解决方法?

1 个答案:

答案 0 :(得分:4)

它仍然在最新和最好的2017预览版15.6.1中完成。我提交了一份错误报告。我们会看到他们说的话。问题似乎是变量是在基于范围的for循环中声明的。以下编译并运行:

[Authorization]
public class TestController : Controller
{
  public ActionResult Index()
  {
    ...
  }

  [Authorization (Roles="admin")
  public ActionResult SecureArea()
  {
    ...
  }

}

这样做:

#include <iostream>

int main()
{
    [] {
        int values[] = {1,2,3};
        const auto e = std::end(values);
        for(auto it = std::begin(values); it!=e; ++it) {
            auto n = *it;
            [&] {
                std::cout << n << std::endl; 
            }();
        }
    }();

    return 0;
}