проблемы с циклами for в лямбдах - PullRequest
9 голосов
/ 08 апреля 2011

В настоящее время я переписываю небольшой проект, который я написал некоторое время назад, и заменяю указатели функций на std::function и лямбды.

При этом я наткнулся на проблему с циклами for в лямбдах. в Visual Studio 2010 (с пакетом обновления 1) генерирует странные ошибки при использовании циклов for внутри лямбда-выражений, если лямбда-выражение определяется в области действия файла:

#include <iostream>

auto print_sum =
    []( int n )
    {
        int sum=0;
        // line below generates: 
        //   error C2143: syntax error : missing ')' before ';'
        for( int i=1; i<=n; ++i ) 
            sum += i;
        std::cout << sum << "\n";
    };

int main()
{
    print_sum(3);
    return 0;
}

следующий фрагмент, однако, компилируется нормально:

#include <iostream>

int main()
{
    auto print_sum =
        []( int n )
        {
            int sum=0;
            for( int i=1; i<=n; ++i )
                sum += i;
            std::cout << sum << "\n";
        };
    print_sum(3);
    return 0;
}

Оба фрагмента прекрасно компилируются с использованием MinGW GCC 4.7.

Кто-нибудь еще наблюдал это поведение? Это ошибка в лямбда-реализации Visual Studio? Знаете ли вы какие-нибудь обходные пути?

Edit:
Отчет об ошибке в Microsoft Connect:
https://connect.microsoft.com/VisualStudio/feedback/details/660742/error-with-for-loops-in-file-scope-lamdas-c-0x#details

1 Ответ

5 голосов
/ 08 апреля 2011

Я могу проверить это поведение в Visual Studio 2010 RTM. Похоже, что он ограничен только циклами, поскольку следующие компиляции просто отлично.

auto print_sum =
    [](int n)
    {
        int sum=0;
        int i = 1;
        while (i <= n)
        {
            sum += i;
            i++;
        }
        std::cout << sum << "\n";
    };

Я бы определенно предупредил Microsoft об этой проблеме, сообщив об ошибке при подключении

Примечание: я не на 100% знаю, является ли это ошибкой, но доказательства предполагают , что это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...