请考虑以下结构:
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,因为我正在为嵌入式应用程序进行编程
答案 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);
}