次のエラーで 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
の変数を not に変更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
inB
の秒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
sunion
の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;
}
言うまでもなく、私は完全に途方に暮れています。私よりもコンパイラをよく理解している人からの支援をいただければ幸いです。