将 IPv4 地址转换为 std::array 字节时符号转换错误

Wrong sign conversion when converting IPv4 address to std::array of bytes

我对尝试将 ipv4 地址 in_addrstruct sockaddr_in 转换为 uint32_t 的 std::array 时收到的以下编译器警告感到困惑字节。

std::array<uint8_t, 4> IpAddress;
struct in_addr in_addr = {};
const char* addr_str = "168.212.226.204";

if (inet_pton(AF_INET, addr_str, &in_addr))
{
    uint8_t* addr = reinterpret_cast<uint8_t*>(&(in_addr.s_addr));

    for (int i = 0; i < 4; i++)
    {
        IpAddress[i] = addr[i]; // warning: conversion to 'std::array<unsigned char, 4>::size_type {aka long unsigned int}' from 'int' may change the sign of the result [-Wsign-conversion]
    }
}

我该如何解决这个问题?

警告在这里:

IpAddress[i] = addr[i];
         ^^^

因为 i 是一个 int,但是 std::array 的运算符 [] 接受 size_type,你会得到一个警告。

您可以通过简单地将 i 更改为 size_t 而不是 int 来解决此问题:

    for (size_t i = 0; i < 4; i++)

警告似乎在数组索引本身,i,循环计数器上。数组索引是无符号类型。仔细查看实际错误信息:

warning: conversion to 'std::array<unsigned char, 4>::size_type

猜猜size_type是什么意思?