Лямбда-функция не компилируется в Visual Studio 2010 - PullRequest
1 голос
/ 28 января 2012

Мне больше интересно знать, ПОЧЕМУ он не компилируется, чем исправлять код.

фатальная ошибка C1001: в компиляторе произошла внутренняя ошибка.

int main()
{
    class MyClass
    {
    public:
        MyClass(const std::string & name)
            : name_(name) {}
        std::string name_;
    };

    auto creator = []() -> MyClass *
    {
        return new MyClass("Hello World");
    };

    MyClass * pMyClass = creator();

    return 0;
}

Ответы [ 2 ]

6 голосов
/ 28 января 2012

фатальная ошибка C1001: в компиляторе произошла внутренняя ошибка.

Каждый раз, когда вы видите внутреннюю ошибку компилятора, вы видите ошибку в самом компиляторе.По сути, компилятор не выдал ошибку компилятора;он потерпел крах .

В этих случаях не существует «почему» в том, что касается того, когда они происходят (нет, если только у него не заканчивались ресурсы).Или, по крайней мере, не тот, который легко определить.Лучше всего попытаться изменить код, чтобы заставить компилятор работать.

Если вы не используете VC2010 SP1, обновитесь до пакета обновления и повторите попытку.

3 голосов
/ 28 января 2012

Как еще одна точка данных, 64-разрядная версия компилятора VS 2010 не падает, но вместо этого выдает эту ошибку:

test.cpp(16) : error C2061: syntax error : identifier 'MyClass'

Если определение class MyClass выходит за пределы main(), то будут работать и компиляторы x86 и x64.

Очевидно, что сбой компилятора x86 является ошибкой. Я считаю, что использование локального типа MyClass должно быть хорошо в лямбде (и GCC 4.6.1 с -std=gnu++0x не имеет проблем с этим), поэтому я думаю, что ошибка, которую выдает компилятор x64, также является ошибкой. 1010 *

В настоящий момент у меня нет доступа к VS 11 Dev Preview, чтобы проверить, сохраняется ли проблема.

VS 11 Dev Preview (cl.exe версия 17.00.40825.2) не имеет проблем с локальным типом MyClass, используемым в лямбде.

...