【问题标题】:Brace-initialization of an array of structs in c++11c++11中结构数组的大括号初始化
【发布时间】:2015-01-31 12:22:42
【问题描述】:

这是我的代码:

#include <string>

struct A
{
    int a;
    std::string sa;
};

int main()
{
    A arr[3]{};
}

当我使用 gcc 4.8.2(在 Ubuntu 14.04 上)和 -std=gnu++11 选项编译它时,我收到以下错误:

example.cpp: In function ‘int main()’:
example.cpp:11:14: internal compiler error: in gimplify_init_constructor, at gimplify.c:4271
 A arr[3]{};
          ^

为什么会引发内部编译器错误?它是编译器错误吗?

【问题讨论】:

    标签: c++ linux c++11 gcc list-initialization


    【解决方案1】:

    内部编译器错误始终是编译器错误,并没有说明代码是否有效。

    如果代码无效,编译器应该给出一条错误消息,告诉您代码有什么问题。内部编译器错误只会告诉您编译器出了什么问题。

    鉴于此内部编译器错误仍然存​​在于更高版本中(我刚刚检查了 4.9.2 以及截至 1 月 29 日的当前源),我通常强烈建议将此作为错误报告给 GCC 开发人员,但是快速搜索reveals that it's already known to them

    您可以通过写A arr[3]{{}}; 来解决它,这意味着同样的事情。它包含与默认情况下已经获得的 arr 的第一个元素相同的初始化程序。

    【讨论】:

      【解决方案2】:

      当我将std::string 添加到数组结构的内容时,我在 gcc 4.8.5 中遇到了同样的问题。如上所述添加额外的{} 会有所帮助。也许这可以提供为什么会发生此编译器错误的线索。

      【讨论】:

        猜你喜欢
        • 2020-02-08
        • 1970-01-01
        • 2022-01-18
        • 2018-07-13
        • 1970-01-01
        • 1970-01-01
        • 2019-01-11
        • 2014-07-31
        相关资源
        最近更新 更多