【问题标题】:Aggregate initialization, clang wants me to break my code?聚合初始化,clang要我破坏我的代码?
【发布时间】:2019-10-24 16:35:14
【问题描述】:

为什么 clang 建议我在初始化二维标准数组时添加额外的大括号?这会导致错误。还是我只是没有看到他想让我做什么?

我知道我可以添加外部大括号,以明确我正在初始化该类的第一个成员,但这不会使警告消失。我不认为我可以添加任何其他大括号。

在 Godbolt 上编译 clang9.0.0 -O0 -std=c++17 -Wall -Wno-unused-value

Link

#include <array>

int main() {
    std::array<std::array<float, 3>, 3> {
        1,2,3,
        1,2,3,
        1,2,3
    };

    std::array<std::array<float, 3>, 3> {{
        1,2,3,
        1,2,3,
        1,2,3
    }};
}

如果警告会告诉我在我的示例中执行第二个变体,我会没问题,但似乎他希望我包装内部数组成员,而您不能这样做。

有关聚合初始化的一些信息:CppRefference

【问题讨论】:

    标签: c++ stdarray


    【解决方案1】:

    两个版本创建两个相等的数组:

    #include <array>
    
    int main() {
        std::array<std::array<float, 3>, 3> a {{
            {1,2,3},
            {1,2,3},
            {1,2,3}
        }};
    
        std::array<std::array<float, 3>, 3> b = {{
            {1,2,3},
            {1,2,3},
            {1,2,3}
        }};
    }
    

    【讨论】:

    • 是我遗漏了什么还是两个列表相同?
    • @NathanOliver 在第二个中有一个=,否则完全相同。 :-)
    • 啊,好吧。我以为你是说列表有两个版本。
    • @NathanOliver Aha,不,添加了一条注释。不知道我是否说得更清楚了。 :-/
    • 谢谢你,我只测试了大括号中的内部 3 个成员或额外的外部大括号。我确定我同时测试了两者,但似乎我没有。
    猜你喜欢
    • 1970-01-01
    • 2016-10-22
    • 2012-08-12
    • 2015-09-06
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    相关资源
    最近更新 更多