使用 sockaddr 安全 reinterpret_cast?

fre*_*ish 6 c++ type-safety undefined-behavior reinterpret-cast

假设我正在做一些套接字编程:

struct sockaddr_in sa;
inet_pton(AF_INET, "127.0.0.1", &(sa.sin_addr));
auto *resa = reinterpret_cast<struct sockaddr*>(&sa);
bind(sfd, resa, sizeof(sa));
Run Code Online (Sandbox Code Playgroud)

现在的问题是:我们这样做了reinterpret_cast(或者(struct sockaddr *)像教程或 man 中的C 风格类型转换)但是标准并不能保证它可以工作,对吧?另一方面,似乎没有办法以不同的方式做到这一点,bind()需要struct sockaddr*(并且它必须访问底层结构以确定它收到了什么)。

那么reinterpret_cast在这种情况下在不同类型之间进行操作是否安全?如果是,那为什么?

sup*_*cat 4

标准将支持多种指针操作的能力视为实现质量问题。该标准并不强制要求所有实现都适合低级或系统编程,但适合此类目的的高质量实现(例如 Unix)应该支持此类平台上的系统代码通常使用的语义类型。实现可能无法处理以类型无关的方式处理结构的共享部分的代码,但仍然是用于某些不涉及任何低级或系统编程的特殊目的的高质量实现。另一方面,适合低级编程的高质量实现在处理此类代码时应该没有问题。任何无法处理此类代码的实现都应被视为低质量实现和/或不适合低级编程,并且低级程序无法使用此类实现并不是缺陷。