【问题标题】:Mixing for each and lambdas in c++在 C++ 中混合每个和 lambdas
【发布时间】:2011-04-12 12:40:44
【问题描述】:

我想在 C++0x 中使用 lambda 和 for each(基于范围的 for 循环,而不是 STL for_each)。所以我去了 wiki 并尝试使用 lambdas 重写 wiki 中的示例:

    std::vector<int> some_list;
some_list.push_back(42);
some_list.push_back(37);
int total = 0;
int value = 5;
for(int& x:some_list)
{
    [](int x)
    {
        cout << "xL=" <<x <<endl;
    };
}

for(auto x:some_list)
    cout<< "x="<<x<<endl;

    return result;
}

问题是我在 lambda 版本中看不到任何 cout,因为每个版本都很好地打印 x...我认为不可能将每个版本和 lambdas 混合在一起,因为 lambdas 只能代替 "函数”,不能作为循环体,但我不确定,所以如果有人能确认它会很酷

编译器:GCC 4.6

【问题讨论】:

  • 请向我们展示完整的源代码。

标签: lambda foreach c++11


【解决方案1】:

您应该在 lambda 本身上调用 operator()。

for(int& x:some_list)
{
    [](int x)
    {
        cout << "xL=" <<x <<endl;
    }(x);  //notice the "()"
}

【讨论】:

  • Tnx,但它仍然无法编译...错误:不匹配调用 '(main(int, char**)::) ()' :注意: 候选人是:被早期的错误弄糊涂了,打算退出
  • 此 lambda 需要调用一个参数。
  • 酷,tnx,当有人告诉你如何做时,它是“哦,doh”的事情之一,但你永远无法自己弄清楚。
  • 这有什么意义?您不妨在里面添加另一个嵌套的 lambda。 [](int x) { [](int x) { cout &lt;&lt; "x=" &lt;&lt; x &lt;&lt;endl; }(x); }(x);
【解决方案2】:

在第一个“for”中,您只创建 lambda 函数,而不是调用它。

实际上 lambda-function 在这里似乎没有用 - 您可能只是编写代码。但是,如果您仍然想使用 lambda,请在“}”之后添加“()”。

它在另一种情况下很有用 - 当使用 std::for_each 时。

【讨论】:

    【解决方案3】:

    您正在使用常规的 for 循环,它不需要 lambda。花括号只是一个代码块,因此您所做的是为每次迭代定义 lambda,但不调用它。

    你想做的是使用std::for_each

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      相关资源
      最近更新 更多