小编Kri*_*son的帖子

修改 char 数组时,reintrepret_cast to char* 是否定义良好?

当从套接字接收预期消息时,请考虑以下示例:

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() …

c++ pointers casting language-lawyer c++17

5
推荐指数
1
解决办法
422
查看次数

标签 统计

c++ ×1

c++17 ×1

casting ×1

language-lawyer ×1

pointers ×1