компилятору не хватает места в куче на этапе 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;
}

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

6

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]