c++ - VC++14 (VS2015) 中数组值初始化的内部编译器错误

标签 c++ c++11 visual-studio-2015 array-initialization internal-compiler-error

我在 Visual Studio 2015 CTP 6 上得到一个 ICE。不幸的是,这是在一个大型项目中发生的,我不能在这里发布整个代码,而且我无法在最小样本上重现该问题.我希望得到的帮助是构建这样的示例(提交给 Microsoft),或者可能是关于正在发生的事情和/或我做错了什么的启发。

这是我正在做的事情的模型。 (请注意,我在这里展示的代码不会生成 ICE;我只是用这个简单的例子来解释这种情况。)

我有一个不可复制的类 A(它有几个“引用”成员)并且没有默认构造函数。另一个类 B 包含一个 A 数组(A 值的普通 C 数组,没有引用/指针),我正在初始化它B 的构造函数中的数组使用统一的初始化语法。请参阅下面的示例代码。

struct B;

struct A
{
    int & x;
    B * b;

    A (B * b_, int & x_) : x (x_), b (b_) {}
    A (A const &) = delete;
    A & operator = (A const &) = delete;
};

struct B
{
    A a [3];
    int foo;

    B ()
        : a {{this,foo},{this,foo},{nullptr,foo}}  // <-- THE CULPRIT!
        , foo (2)
    {  // <-- This is where the compiler says the error occurs
    }
};

int main ()
{
    B b;
    return 0;
}

我不能使用 std::array 因为我需要在它们的最终位置构造元素(不能复制。)我不能使用 std::vector 因为我需要 B 来包含 A

请注意如果我不使用数组并使用单个变量(例如 A a0, a1, a2;,我可以 这样做是因为阵列很小且大小固定)ICE 消失了。但这不是我想要的,因为我将失去通过索引访问它们的能力,而这是我需要的。我可以在数组上使用松散变量的 union 来解决我的 ICE 问题获取索引(使用变量构造,使用数组访问,)但我认为这会导致“未定义的行为”看起来很复杂。

上面的示例和我的实际代码之间的明显区别(除了比例)是 AB 是类而不是结构,每个都是声明/定义的在它自己的源/头文件对中,并且没有一个构造函数是内联的。 (我复制了这些,但仍然无法重现 ICE。)

对于我的实际项目,我尝试清理构建的文件并重建,但无济于事。有什么建议等吗?

附言我不确定我的标题是否合适。有什么建议吗?!?!

更新 1:这是 C1001 fatal error 消息中引用的编译器文件:(compiler file 'f:\dd\vctools\compiler\utc\src\p2\main. c',第 230 行)

更新 2:由于我忘记提及,代码库在 GCC 4.9.2 下以 C++14 模式干净地(正确地)编译。

此外,我在编译时禁用了所有优化。

更新 3:我发现如果我重新排列 B 中的成员数据并将数组放在最后,代码就会编译。我已经尝试了其他几种排列,它有时会编译,有时不会。我看不到关于在数组之前出现的其他成员的任何模式使编译器完全 ICE! (是 UDT 还是原语,是否有构造函数,是否有 POD,引用或指针或值类型,...)

这意味着我对我的问题有某种解决方案,虽然我的内部类布局对我和这个应用程序很重要,但我可以容忍性能下降(由于将一些热数据与其余数据分开导致缓存未命中) 为了克服这个问题。

但是,我仍然非常喜欢能够提交给 Microsoft 的 ICE 的最小复制。我不想在接下来的两年里(至少!)一直受困于此

更新 4:我已经尝试过 VS2015 RC,但 ICE 仍然存在(尽管错误消息指的是不同的内部代码行,同一“main.c”文件中的第 247 行。 )

我打开了一个bug report on Microsoft Connect .

最佳答案

我确实向微软报告了这个问题,在与他们分享了我的一些项目代码后,问题似乎已经被追踪并修复。他们表示该修复程序将包含在最终的 VC14 版本中。

感谢您的评论和指点。

关于c++ - VC++14 (VS2015) 中数组值初始化的内部编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30416989/

相关文章:

c++ - 从 dtor 安全地抛出异常

c++ - 为什么这段代码没有编译

c++为什么级联共享对象链接

c++ - 意外警告 : inline function used but never defined

c++ - xmlReadMemory - 未知 'url' 参数

c++ - 静态断言可变参数模板的嵌套值是唯一的

typescript - Visual Studio 2015 只允许删除 Typescript 文件

azure - "Microsoft.CodeAnalysis.BuildTasks.Csc"任务无法加载

c++ - 为什么我需要 std::endl 来重现我用 getline() 得到的输入行?

c++ - 在 Windows 上等待进程随机失败