如何在不制作额外副本的情况下从 sockaddr_in6 创建一个 boost::asio::ip::address_v6?

How to create an boost::asio::ip::address_v6 from sockaddr_in6 without making an extra copy?

问题是 address_v6 class 严格接受原始数据 bytes_type class:

typedef array< unsigned char, 16 > bytes_type;

但是 sockaddr_in6 结构没有那个,它有 C 风格的数组,如果不复制就不能转换为 std::array。所以我必须创建一个 std::array,在那里复制数据,然后将该数组传递给 address_v6,它将数据从 std::array 复制到它的内部缓冲区。

我希望我可以使用或实现一些 C 风格的数组查看器 class 但无论如何我都无法将它传递给构造函数,因为它不是模板函数。

有没有什么方法可以创建 address_v6 而无需额外复制数据?

std::array 拥有其内存,无法创建视图并将其传递给 std::array。而且没有这个必要。在堆栈上分配 std::array 并进行复制,这不是昂贵的操作,您只需要复制 16 个字节。

std::array 必须是包含原始数组作为其第一个也是唯一一个非静态数据成员的结构。由于原始数组包含 unsigned char,因此它是标准布局 class。所以我无法从标准中找到以下代码不起作用的原因:

auto& bytearray = reinterpret_cast<std::array<unsigned char,16>&>(ipv6socket->sin6_addr.s6_addr); 

如果要复制,请将 auto& 替换为普通 auto