8

次のエラーで 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;
}

ラッパーの代わりにプレーンintinBの秒unionを使用すると、機能します。structint

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デフォルトで初期化すると、機能します。B1

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;
}

最後に、構造体からBsunionIntメンバーを取り出すと、機能します。

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;
}

言うまでもなく、私は完全に途方に暮れています。私よりもコンパイラをよく理解している人からの支援をいただければ幸いです。

4

0 に答える 0