【问题标题】:c++ std::array warningc++ std::array 警告
【发布时间】:2013-02-10 03:45:46
【问题描述】:

关于以下代码

std::array<int,3> myarray = {10,20,30};

我收到以下编译器警告

warning: missing braces around initializer for ‘std::array<int, 3u>::value_type [3] {aka int [3]}’ [-Wmissing-braces]

为什么?

工具链:(编辑)

g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

【问题讨论】:

  • 我们应该猜测您使用的是什么工具链吗?

标签: c++ arrays stl


【解决方案1】:

试试这个:

std::array&lt;int,3&gt; = {{10, 20, 30}}

我认为这是他们在 > 4.6 版本中修复的错误

【讨论】:

    【解决方案2】:

    正如 Tyler 所指出的,std::array 是一个 POD,因此它没有构造函数,并且包含一个数组。要使用大括号语法对其进行初始化,请先初始化变量,然后使用嵌套的大括号初始化变量内的数组。

    { { 10, 20, 30 } }
      ^ For the array member variable inside the std::array object
    ^ For the std::array object
    

    实际上这是您的编译器中的一个错误,因为聚合初始化允许您在 = 之后删除一层大括号。所以这两个是合法的:

    std::array<int,3> x = {10, 20, 30};
    std::array<int,3> y  {{10, 20, 30}};
    

    但不是

    std::array<int,3> z {10, 20, 30};
    

    最后一个在 GCC 上编译,但它是一个非标准的扩展,你应该得到一个警告。

    【讨论】:

    • 在 g++ 4.7 上只使用一对大括号。
    • 在我的 Mac LLVM 4.2 上也可以使用单括号。所以我问他有什么链子。
    • @WhozCraig 显然聚合初始化允许您在 = 之后删除层。
    • @SethCarnegie 是的,我现在明白了。有趣的是,如果没有它,您需要如何感知容器。至少你仍然可以这样做,这比旧实现中的许多事情都要多。
    • @Seth "但不是std::array&lt;int,3&gt; z {10, 20, 30}; "
    猜你喜欢
    • 2014-12-15
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 2022-01-23
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    相关资源
    最近更新 更多