VC ++ 17内部编译错误

时间:2017-07-16 19:23:06

标签: c++ visual-c++

我有一些非常怪异的代码会导致编译器崩溃。我使用的是VC ++ 17:

//.hpp
typedef unsigned short UID;
typedef UID GoodType;
typedef struct _Recipe
{
    typedef struct {
        GoodType goodType; unsigned short units;
    } GoodRatio;
    std::vector<GoodRatio> input;
    GoodRatio output;
    //int a;
} Recipe;

//.cpp
int main()
{
    std::vector<Recipe> recipes
    {
        {
            { { 0, 1 }, { 1, 2 } }, { 2, 1 }
        },
    };
}

错误:

1>c:\users\peter\downloads\nationsgamemockup\nationsgamemockup\nationsgamemockup.cpp(25): fatal error C1001: An internal error has occurred in the compiler.
1>(compiler file 'f:\dd\vctools\compiler\utc\src\p2\main.c', line 255)
1> To work around this problem, try simplifying or changing the program near the locations listed above.

到目前为止我观察到的行为:

如果我取消注释//int a;行,无论是否在main函数的构造函数调用中为a添加参数,错误都会消失。

如果我评论std::vector<GoodRatio> input;行并从构造函数中删除相应的参数,则错误就会消失。

如果我评论GoodRatio output;行并从构造函数中删除相应的参数,则错误就会消失。

如果我将recipes中的main变量更改为一个recipe,则错误就会消失(就像简单Recipe a{ { { 0, 1 },{ 1, 2 } },{ 2, 1 } };一样)。

注意: _Recipe结构不能是匿名结构,因为它具有类型为std::vector<GoodRatio>的数据成员,而Recipe::GoodRatio类型仅在typedef之后的分号处存在。这至少是我的猜测。如果我尝试这样做,我会收到错误。

编辑:我的问题是:为什么会这样?

1 个答案:

答案 0 :(得分:0)

向GoodRatio添加构造函数似乎解决了这个问题:

GoodRatio(unsigned short goodType = {}, unsigned short units = {}) :
goodType{ goodType }, units{ units } {}

我也向微软发送了反馈意见。