当从套接字接收预期消息时,请考虑以下示例:
struct myData {
uint8_t type;
int value;
}
myData readFromSocket(int socketFD) {
myData data{};
ssize_t bytes = recv(socketFD, reinterpret_cast<char*>(&data), sizeof(myData), 0);
if(bytes == sizeof(myData))
return data;
return myData{};
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我不清楚行为是否定义良好。
根据cppreference.com 上的reintrpret_cast,该行为已明确定义以供检查,因为 char 的对齐不如 myData 严格,并且因为强制转换专门针对 char 指针。我不清楚检查是否仅限于读取或是否包括对强制转换指针的写入。
5)解释下:
任何对象指针类型 T1* 都可以转换为另一个对象指针类型 cv T2*。这与 static_cast<cv T2*>(static_cast<cv void*>(expression)) 完全相同(这意味着如果 T2 的对齐要求不比 T1 更严格,则指针的值不会更改,并且结果指针的转换返回到其原始类型会产生原始值)。无论如何,只有在类型别名规则允许的情况下,才可以安全地取消引用结果指针(见下文)
以及类型别名的第三点:
AliasedType 是 std::byte (C++17 起)、char 或 unsigned char:这允许将任何对象的对象表示形式检查为字节数组。
我已经测试了与上面类似的代码,没有任何问题,但是由于这一切都取决于编译器所做的优化,我发现很难给出可能失败的确切示例。
本文提到向另一个方向(即从char*到 )进行转换myData会出现未定义的行为,并建议使用memcpy()。我的假设是,由于类型别名规则未涵盖强制转换,因此得出了此结论。
然而,这个邮件线程令人怀疑memcpy() …