1

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

#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);
    }
}
4

1 回答 1

4

首先,你不能抛弃 constness:

§5.2.10p2。reinterpret_cast操作员不应抛弃 constness (§5.2.11) 。(...)

所以你至少需要把它写成

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

或者

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

最重要的是,您需要同时拥有Bufferiovec成为标准布局类型,并且iovec不能有比Buffer.

§5.2.10p7。对象指针可以显式转换为不同类型的对象指针。当v“pointer to T1”类型的纯右值转换为“pointer to cv T2 ”类型时,结果是static_cast<cv T2*>(static_cast<cv void*>(v)) 如果T1T2都是标准布局类型(第 3.9 节)并且 的对齐要求T2不比 的更严格T1,或者如果两者之一类型是void。(...)

您还需要注意不要违反严格的别名规则:通常,您不能使用两个指针或对不同类型的引用来引用相同的内存位置。

于 2011-09-22T00:28:45.153 回答