如何避免在C ++ 11中使用lambda表达式中的任意表达式初始化捕获的成员?

时间:2015-05-26 16:26:51

标签: c++ algorithm lambda find compare

我的代码如下:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct A
{
    int index;
    A(int p_i) : index(p_i) {}
};
struct B
{
    int index;
    B(int p_i) : index(p_i) {}
};
int main(int argc, const char * argv[])
{
    vector<A> tmp_v_x { A(5), A(6), A(3) };
    B tmp_array_b[3] = { B(6), B(5), B(3) };
    for(unsigned short int i = 0; i < 3; ++i)
    {
        if(std::find_if(tmp_v_x.begin(), tmp_v_x.end(), [&p_1 = tmp_array_b[i]](const A& p_2) -> bool { return p_1.index == p_2.index; }) == tmp_v_x.end())
        {
            cout << "Mismatch" << endl;
        }
    }
    return 0;
}

我收到了一个错误:

error: lambda capture initializers only available with -std=c++1y or -std=gnu++1y [-Werror]

这是因为我的编译器没有得到对C ++ 14的支持。我怎样才能改进它可以在编译器上运行的代码,而编译器只支持C ++ 11? 我不想改变这段代码的语义。感谢。

3 个答案:

答案 0 :(得分:1)

您可以在lambda:

之前声明变量
auto& p_1 = tmp_array_b[i];
if (std::find_if(tmp_v_x.begin(), tmp_v_x.end(),
                 [&p_1](const A& p_2) -> bool { return p_1.index == p_2.index; })
     == tmp_v_x.end())

因为局部变量p_1的寿命比你的lambda长。

答案 1 :(得分:1)

这是另一种可能性:捕获tmp_array_b和i

int main(int argc, const char * argv[])
{
    vector<A> tmp_v_x{ A(5), A(6), A(3) };
    B tmp_array_b[3] = { B(6), B(5), B(3) };
    for (unsigned short int i = 0; i < 3; ++i)
    {
        if (std::find_if(tmp_v_x.begin(), tmp_v_x.end(), [&tmp_array_b, i](const A& p_2) -> bool { return tmp_array_b[i].index == p_2.index; }) == tmp_v_x.end())
        {
            cout << "Mismatch" << endl;
        }
    }
    return 0;
}

答案 2 :(得分:1)

您有一个索引变量i用于索引tmp_array_b。使用基于范围的for并在那里捕获循环变量。

    B tmp_array_b[3] = { B(6), B(5), B(3) };
    for(auto& tmp_val : tmp_array_b)
    {
        if(std::find_if(tmp_v_x.begin(), tmp_v_x.end(), [&tmp_val](const A& p_2) -> bool { return tmp_val.index == p_2.index; }) == tmp_v_x.end())
        {
            cout << "Mismatch" << endl;
        }
    }