具有固定大小的数组成员的结构的C ++大括号初始化

时间:2018-08-03 12:48:06

标签: c++ struct initialization initializer-list

请考虑以下结构:

struct IPv6Address {
    uint8_t x[16];

    uint8_t& operator[](size_t pos) { return x[pos]; }
    uint8_t* bytes() { return x; }
}

static const IPv6Address WELL_KNOWN_ADDRESS =       //ff02::1
    {0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};

像这样的括号初始化工作正常。但是,一旦添加构造函数,括号初始化将不再起作用。除了大括号初始化之外,我还想拥有这个构造函数:

IPv6Address(uint8_t bytes[16]) { memcpy(x, bytes, sizeof(x)); }

很显然,一旦添加自己的构造函数,就不再隐式定义任何构造函数。但是在这种情况下,如何重新定义花括号初始化或强制编译器创建所有默认构造函数?

额外要求:我无法使用stdlib,因为我正在为嵌入式应用程序进行编程

2 个答案:

答案 0 :(得分:2)

您可以在现有的构造函数中简单地使用双括号列表(不允许initialiter_list时使用)

static const IPv6Address WELL_KNOWN_ADDRESS =  
{{0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}};

答案 1 :(得分:1)

将构造函数与initializer_list

一起使用

以下构造函数应完成以下工作:(未测试)

IPv6Address(std::initializer_list<uint8_t> c) : x{} {
  assert(c.size() <= std::size(x));
  std::copy(c.begin(), c.end(), x);
}