【问题标题】:Why is double brace required to initialize std::array of structs [duplicate]为什么初始化结构的std :: array需要双括号[重复]
【发布时间】:2021-07-14 02:56:27
【问题描述】:

在 C++17 中,为什么这种初始化 std::array 的方式不起作用?

#include <array>
#include <string_view>

class myClass {

private:  

 struct myStruct {
        const std::string_view a;
        const int b;
        const int c;
    };

    static inline constexpr std::array<myStruct, 2> myArray = {{"", 0, 0},{"", 0, 0}};
};

我认为 CWG 1270 中的更改涵盖了这种风格。但是,我发现使其发挥作用的唯一方法是:

   static inline constexpr std::array<myStruct, 2> myArray = {{{"", 0, 0},{"", 0, 0}}};

   static inline constexpr std::array<myStruct, 2> myArray = {myStruct{"", 0, 0},myStruct{"", 0, 0}};

【问题讨论】:

  • 建议您也将遇到的错误添加到问题中,这样我就可以确定(或者可以确定我们可以使用不同的编译器发出不同的错误消息)我们都在寻找同一个问题。
  • 山姆只是朝着我前进的方向前进。他只是进一步简化了问题。 I stopped at the struct and the array

标签: c++


【解决方案1】:

让我们用一个更简单的例子来解决这个问题:

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

我们首先查看how std::array is defined。它有

与仅包含 C 样式数组 T[N] 的结构具有相同的语义 非静态数据成员。

因此,换句话说,这个std::array 是一个具有单个“非静态数据成员”的对象,它是一个 C 样式的数组。基于此,我们可以得出:

  • 最外层的大括号服务器初始化std::array本身。

  • 最里面的一组大括号初始化这个未命名的数据成员。

换句话说,这与以下内容完全相同:

struct my_array {

    int a[3];
};

my_array arr{{1,2,3}};

这就是为什么总是使用双外括号来初始化std::array 的实例。

【讨论】:

  • 虽然我理解您的解释,但您的示例可以通过仅使用单个大括号进一步简化: std::array arr{1,2,3};所以,我的问题是为什么我不能用结构类型做到这一点?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 2012-10-02
  • 2013-06-03
相关资源
最近更新 更多