Смешивание для каждого и лямбда-выражений в С++

Я хотел немного поиграть с лямбда-выражениями и для каждого (цикл for на основе диапазона, а не STL for_each) в C++0x. Итак, я пошел в вики и попытался переписать примеры из вики, используя лямбда-выражения:

    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;
}

Проблема в том, что я не вижу никакого cout в лямбда-версии, для каждой версии хорошо печатает x... Я предполагаю, что невозможно смешивать для каждого и лямбда-выражения, потому что лямбда-выражения могут быть только вместо "функций", и не может выступать в качестве тела цикла, но я не уверен, поэтому, если кто-то может подтвердить, это было бы круто

компилятор: GCC 4.6


person NoSenseEtAl    schedule 12.04.2011    source источник
comment
Пожалуйста, покажите нам полный исходный код.   -  person Klaim    schedule 12.04.2011


Ответы (3)


Вы должны сделать вызов operator() на самой лямбде.

for(int& x:some_list)
{
    [](int x)
    {
        cout << "xL=" <<x <<endl;
    }(x);  //notice the "()"
}
person Tony The Lion    schedule 12.04.2011
comment
Tnx, но он все еще не компилируется... ошибка: не соответствует вызову '(main(int, char**)::‹lambda(int)›) ()': примечание: кандидаты: запутаны более ранними ошибками , выручая - person NoSenseEtAl; 12.04.2011
comment
Эта лямбда требует аргумента для вызова. - person Klaim; 12.04.2011
comment
круто, спс, это одна из тех вещей, которые ох, дох, когда кто-то говорит вам, как это сделать, но вы никогда не сможете понять это самостоятельно. - person NoSenseEtAl; 12.04.2011
comment
Какой в ​​этом смысл? Вы также можете добавить еще одну вложенную лямбду внутрь. [](int x) { [](int x) { cout << "x=" << x <<endl; }(x); }(x); - person Motti; 12.04.2011

В первом "for" вы только создаете лямбда-функцию, а не вызываете ее.

На самом деле лямбда-функция здесь не кажется полезной - вы можете просто написать код. Но если вы все равно хотите использовать лямбду, добавьте «()» после «}».

Это полезно в другой ситуации - когда используется std::for_each.

person maxim1000    schedule 12.04.2011

Вы используете обычный цикл for, он не ожидает лямбда. Фигурные скобки — это просто блок кода, поэтому вы определяете лямбду для каждой итерации, но не вызываете ее.

То, что вы хотите сделать, это использовать std::for_each.

person Motti    schedule 12.04.2011