标准布局类型和reinterpret_cast

发布于 2024-12-06 00:41:13 字数 456 浏览 1 评论 0原文

如果我已将结构体的成员复制到我的类中,是否可以从我的类转换为结构体?

#include <stdint.h>
#include <sys/uio.h>

class Buffer
{
public:
    void * address;
    size_t size;

    Buffer(void * address = nullptr, size_t size = 0)
        : address(address), size(size)
    {
    }

    operator iovec *() const
    {
        // Cast this to iovec. Should work because of standard layout?
        return reinterpret_cast<iovec *>(this);
    }
}

Am I allowed to cast from my class to a structure if i have copied the members of the structure to my class?

#include <stdint.h>
#include <sys/uio.h>

class Buffer
{
public:
    void * address;
    size_t size;

    Buffer(void * address = nullptr, size_t size = 0)
        : address(address), size(size)
    {
    }

    operator iovec *() const
    {
        // Cast this to iovec. Should work because of standard layout?
        return reinterpret_cast<iovec *>(this);
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

总攻大人 2024-12-13 00:41:13

首先,你不能抛弃常量:

§5.2.10p2。 reinterpret_cast 运算符不得放弃常量性(第 5.2.11 节)。 (...)

所以你至少需要将其写为

operator iovec const*() const
{
    return reinterpret_cast<iovec const*>(this);
}

or

operator iovec *()
{
    return reinterpret_cast<iovec *>(this);
}

最重要的是,你需要让 Bufferiovec 都是标准布局类型,并且 < code>iovec 的对齐方式不能比 Buffer 更严格(即更大)。

§5.2.10p7。对象指针可以显式转换为对象指针
不同的类型。当“指向 T1 的指针”类型的纯右值 v
转换为“指向 cv T2 的指针”类型,结果为 static_cast(static_cast(v))
如果 T1T2 都是标准布局
类型(§3.9)和 T2 的对齐要求不比
那些T1,或者任一类型为void。 (...)

您还需要小心,不要违反严格的别名规则:一般来说,您不能使用两个指向引用同一内存位置的不同类型的指针或引用。

First off, you cannot cast away constness:

§5.2.10p2. The reinterpret_cast operator shall not cast away constness (§5.2.11). (...)

So you need at least to write that as

operator iovec const*() const
{
    return reinterpret_cast<iovec const*>(this);
}

or

operator iovec *()
{
    return reinterpret_cast<iovec *>(this);
}

On top of that, you need to have both Buffer and iovec be standard-layout types, and iovec cannot have an alignment stricter (i.e. larger) than Buffer.

§5.2.10p7. An object pointer can be explicitly converted to an object pointer of
a different type. When a prvalue v of type “pointer to T1” is
converted to the type “pointer to cv T2”, the result is static_cast<cv T2*>(static_cast<cv void*>(v))
if both T1 and T2 are standard-layout
types (§3.9) and the alignment requirements of T2 are no stricter than
those of T1, or if either type is void. (...)

You also need to be careful not to break the strict aliasing rules: in general, you cannot use two pointers or references to different types that refer to the same memory location.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文