Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: NoSenseEtAlОтветов: 3

Я хотел немного поиграть с лямбда-выражениями и для каждого (цикл 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

  • Пожалуйста, покажите нам полный исходный код. Klaim 12.04.2011

foreachlambdac++11

Ответы

Ответ 1 · рейтинг 4 · Tony The Lion

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

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

Ответ 2 · рейтинг 3 · maxim1000

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

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

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

Ответ 3 · рейтинг 2 · Motti

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы