Компилятору не хватает места в куче на этапе 2 - анонимное объединение, анонимные структуры, конструктор constexpr, статический член

У меня есть код, который не удается скомпилировать с Visual Studio 2015 Community Edition со следующей ошибкой:

фатальная ошибка C1002: компилятору не хватает места в куче на этапе 2

Код

struct Int { int i; };

struct B {
    union {
        struct { int x; };
        struct { Int y; };
    };

    constexpr B() : x(1) {}
};

struct A { static B b; };

B A::b;

int main() {
    return 0;
}

Это самое простое, что мне удалось свести к минимуму состояние сбоя методом проб и ошибок, но многое еще происходит.

Что меня удивило, так это то, что каждое из следующих изменений приводит к тому, что оно компилируется просто отлично...

Удаление constexpr от BКонструктор заставляет его работать:

struct Int { int i; };

struct B {
    union {
        struct { int x; };
        struct { Int y; };
    };

    B() : x(1) {} // <---<<    ( constexpr B() : x(1) {} )
};

struct A { static B b; };

B A::b;

int main() {
    return 0;
}

изменения Aпеременная не static заставляет это работать:

struct Int { int i; };

struct B {
    union {
        struct { int x; };
        struct { Int y; };
    };

    constexpr B() : x(1) {}
};

struct A { B b; }; // <---<<    ( struct A { static B b; }; B A::b; )

int main() {
    return 0;
}

Используя равнину int в B"s unionвторой struct вместо int Обертка заставляет его работать:

struct Int { int i; };

struct B {
    union {
        struct { int x; };
        struct { int y; }; // <---<<    ( struct { Int y; }; )
    };

    constexpr B() : x(1) {}
};

struct A { static B b; };

B A::b;

int main() {
    return 0;
}

По умолчанию инициализации x в Bконструктор, а не прохождение 1 заставляет это работать:

struct Int { int i; };

struct B {
    union {
        struct { int x; };
        struct { Int y; };
    };

    constexpr B() : x() {} // <---<<    ( constexpr B() : x(1) {} )
};

struct A { static B b; };

B A::b;

int main() {
    return 0;
}

Наконец, принимая B"s union"s Int член из структуры заставляет его работать:

struct Int { int i; };

struct B {
    union {
        struct { int x; };
        Int y; // <---<<    ( struct { Int y; }; )
    };

    constexpr B() : x(1) {}
};

struct A { static B b; };

B A::b;

int main() {
    return 0;
}

Достаточно сказать, что я в полной растерянности. Я был бы очень признателен за любую помощь от кого-то, кто понимает компилятор лучше, чем я.

0 ответов

Другие вопросы по тегам